逆波兰表达式
Posted dean-sunpeishuai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逆波兰表达式相关的知识,希望对你有一定的参考价值。
2:逆波兰表达式
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
- 输入
- 输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
- 输出
- 输出为一行,表达式的值。
可直接用printf("%f ", v)输出表达式的值v。 - 样例输入
-
* + 11.0 12.0 + 24.0 35.0
- 样例输出
-
1357.000000
- 提示
- 可使用atof(str)把字符串转换为一个double类型的浮点数。atof定义在math.h中。
此题可使用函数递归调用的方法求解。 - 此题有错:应该是波兰表达式。还有输出保留6位小数。
- 本人代码:
-
import java.util.Scanner; import java.util.Stack; public class Main { public static void main(String[]args) { Scanner sc=new Scanner(System.in); String []news=sc.nextLine().split(" "); Stack<Double>stack=new Stack<Double>(); for(int i=news.length-1;i>=0;i--) { if(news[i].equals("+")) { stack.push((stack.pop()+stack.pop())); } else if(news[i].equals("-")) { stack.push((stack.pop()-stack.pop())); }else if(news[i].equals("*")) { stack.push((stack.pop()*stack.pop())); }else if(news[i].equals("/")) { stack.push((stack.pop()/stack.pop())); }else { try { stack.push(Double.parseDouble(news[i])); } catch (NumberFormatException e) { // TODO 自动生成的 catch 块 continue; } } } System.out.printf("%.6f ",stack.peek()); } }
感谢董卫老师的帮助,找出我的bug。注意输出格式。老师代码:
import java.util.Scanner; import java.util.Stack; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); String[] ss=sc.nextLine().split(" "); Stack<Double> st=new Stack<Double>(); for(int i=ss.length-1;i>=0;i--){ try{ double d=Double.parseDouble(ss[i]); st.push(d); }catch(Exception e){ if("+".equals(ss[i])){ st.push(st.pop()+st.pop()); }else if("-".equals(ss[i])){ st.push(st.pop()-st.pop()); }else if("*".equals(ss[i])){ st.push(st.pop()*st.pop()); }else{ st.push(st.pop()/st.pop()); } } } System.out.printf("%.6f ", st.peek()); } }
以上是关于逆波兰表达式的主要内容,如果未能解决你的问题,请参考以下文章