题目描述:
算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。
输入格式:
输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、/以及运算数,不同对象(运算数、运算符号)之间以空格分隔。
输出格式:
输出前缀表达式的运算结果,保留小数点后1位,或错误信息ERROR。
输入样例:
+ + 2 * 3 - 7 4 / 8 4
输出样例:
13.0
解题思路:
对于前缀或者后缀计算的题,都是一样的套路,采用堆栈。
前缀计算:从右向左判断内容,若为数字,则入栈,遇到符号,出栈两个数据进行运算。指导结束。最后栈中的数据就是最后的结果。
后缀计算:从左向右,同上。
对于本题,所有的坑都在代码中注释到了。。。。。
代码:
package text2; import java.util.Scanner; import java.util.Stack; public class 求前缀表达式的值 { public static void main(String[] args) { // TODO Auto-generated method stub Stack<Double> stack = new Stack<>(); Scanner scanner = new Scanner(System.in); String [] str = scanner.nextLine().split(" "); int number=0,ch=0; int flag = 0; /* * 本以为都是整数,结果踩坑了,有浮点型,不能直接匹配 */ // String regex = "[0-9]*";//正则表达式,用于匹配 for(int i=str.length-1;i>=0;i--) { try { // if(str[i].matches(regex)) { if(!(str[i].equals("-")||str[i].equals("+")||str[i].equals("/")||str[i].equals("*"))) { number++;//记录数字个数 stack.push(Double.parseDouble(str[i])); } else { ch++;//记录符号个数 double a = stack.pop(); double b = stack.pop(); /* * 这就是第三个测试点,除数不能为0 ,Java中除数为0的结果是无穷大 */ if(str[i].equals("/")&&b==0) { flag = 1; break; } double result = count(a,b,str[i]); stack.push(result); } } catch (Exception e) { // TODO: handle exception flag=1;//防止抛异常出错 } } if(flag==1||number-ch!=1||stack.empty()) { System.out.print("ERROR"); }else { double ans = stack.pop(); System.out.println(String.format("%.1f",ans));//java使用%f,不是lf } } public static Double count(double a,double b,String c) { switch (c) { case "+": return a+b; case "-": return a-b; case "*": return a*b; case "/": return a/b; default: return 0.0; } } }