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.02
/ -25 + * - 2 3 4 / 8 4
12.53
/ 5 + * - 2 3 4 / 8 2
ERROR4
+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
- 3-07. 求前缀表达式的值(25)
- 3-07. 求前缀表达式的值(25)
- 3-07. 求前缀表达式的值(25) (ZJU_PAT数学)
- PAT3-07. 求前缀表达式的值
- PAT1023. 求前缀表达式的值(25)
- 02-3. 求前缀表达式的值(25)
- PAT 02-3. 求前缀表达式的值(25)
- 5-21 求前缀表达式的值(25分)
- 7-21 求前缀表达式的值(25 分)
- 求前缀表达式的值
- 求前缀表达式的值
- 求前缀表达式的值
- 浙大PAT 3-07. 求前缀表达式的值 (解题思路)
- 5-21 求前缀表达式的值 (25分)
- PTA 求前缀表达式的值 (25分)
- 5-21 求前缀表达式的值 (25分)
- 5-5 求前缀表达式的值 (25分)
- 求前缀表达式的值(java版)
- java-web-j2e学习建议路线
- 克伦巴赫alpha系数
- unity3d播放透明mov格式视频的一种方式
- 用cookie对用户在某个时间范围内的提交次数进行计数
- 内核启动分析(三)——zImage 解压缩阶段
- 3-07. 求前缀表达式的值(25)
- 教你快速高效接入SDK——Unity统一接入渠道SDK(Unity篇)
- SDN相关组织之ODL(opendaylight)
- 使用#pragma阻止一些warnings
- 张益唐:我的数学人生
- OpenGL ES渲染管线与着色器
- 安装及使用YUICompressor(压缩JS,CSS文件)4
- hdu5317 RGCDQ(dp)
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-02-基于Python的卷积运算