3-07. 求前缀表达式的值(25)

来源:互联网 发布:淘宝上如何找真弩 编辑:程序博客网 时间:2024/04/28 21:33

题目:http://www.patest.cn/contests/ds/3-07

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式说明:

输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、\以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式说明:

输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。

样例输入与输出:

序号输入输出1
+ + 2 * 3 - 7 4 / 8 4
13.0
2
/ -25 + * - 2 3 4 / 8 4
12.5
3
/ 5 + * - 2 3 4 / 8 2
ERROR
4
+10.23
10.2



思路: 对于一个前缀表达式的求值而言,首先要从右至左扫描表达式,从右边第一个字符开始判断,如果当前字符是数字则一直到数字串的末尾再记录下来,如果是运算符,则将右边离得最近的两个“数字串”作相应的运算,以此作为一个新的“数字串”并记录下来。一直扫描到表达式的最左端时,最后运算的值也就是表达式的值。例如,前缀表达式“- 1 + 2 3“的求值,扫描到3时,记录下这个数字串,扫描到2时,记录下这个数字串,当扫描到+时,将+右移做相邻两数字串的运算符,记为2+3,结果为5,记录下这个新数字串,并继续向左扫描,扫描到1时,记录下这个数字串,扫描到-时,将-右移做相邻两数字串的运算符,记为1-5,结果为-4,所以表达式的值为-4。

例:

import java.util.LinkedList;import java.util.Scanner;/** * @author chenhong * *  * */public class Main {public static void main(String[] args){Scanner scanner = new Scanner(System.in);String str = scanner.nextLine(); String[] strs = str.split(" ");//从后开始遍历数组LinkedList<Double> stack = new LinkedList<Double>();String op = "+-*/";for(int i=strs.length-1;i>=0;i--){//如果是操作符if(op.contains(strs[i])){//获取栈顶两个元素double temp1 = stack.pop();double temp2 = stack.pop();//计算值try{double value =calculate(temp1, temp2, strs[i].charAt(0));//新值压入栈stack.push(value); }catch(Exception e){System.out.println("ERROR");return ;}}else //如果是操作数{stack.push(toNum(strs[i]));}}System.out.printf("%.1f",stack.pop());}/** * 计算 value1 op value2 * @throws Exception  * */public static double calculate(double value1, double value2, char op) throws Exception{switch(op){case '+':  return value1+value2;case '-':  return value1-value2;case '*':  return value1*value2;case '/':  if(value2==0)throw new Exception("除数为0"); return value1/value2;default: throw new Exception("非法操作数"); }}/** * 将字符转换成数字, 消除+ ,- 号 * */public static double toNum(String str){if(str.startsWith("+")){return Double.valueOf(str.substring(1));}else if(str.startsWith("-")){return -Double.valueOf(str.substring(1));}else return Double.valueOf(str);}}


0 0
原创粉丝点击