Evaluate Reverse Polish Notation leetcode java
题目:
Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +
, -
, *
, /
. Each operand may be an integer or another expression.
Some examples:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
题解:
这道题,其实上过课的应该都知道,忘记是哪门课讲得了。。知道原理的话就比较容易写出来。下面引用一下什么是Reverse Polish Notation:
“标准的表达式如"A+B",在数学上学名 叫中缀表达式(Infix Notation),原因是运算符号在两个运算对象的中间。相对应的还有前缀表达式(Prefix Notation),如:"+ - A * B C D",转换成中缀表达式为:"A - B * C + D";后缀表达式(Postfix Notation),比如前所述的中缀表达式转换为后缀表达式为:"A B C * - D +"。为了纪念波兰数学家鲁卡谢维奇(Jan Lukasiewicz),前缀表达式被称作波兰表达式,后缀表达式称为逆波兰表达式(Reverse Polish Notation)。
后缀表达式的优点是显而易见的,编译器在处理时候按照从左至右的顺序读取逆波兰表达式,遇到运算对象直接压入堆栈,遇到运算符就从堆栈提取后进的两个对象进行计算,这个过程正好符合了计算机计算的原理。
后缀表达式比前缀表达式更加易于转换,并且它的最左面一定为数字,这一点在实际编程的时候就会体会到它的好处了。
逆波兰表达式有一个更大的优点,就是拆括号,根据运算符的级别将中缀表达式转换成逆波兰表达式后,运算顺序就已经替代了运算符的级别,这样也避免了括号提高运算级别的特殊处理。
事 实上,人的思维方式很容易固定~~!正如习惯拉10进制
1 public static int evalRPN(String[] tokens) {
2 if(tokens==null||tokens.length==0)
3 return 0;
4 int ans = 0;
5 Stack<Integer> res = new Stack<Integer>();
6 for(int i = 0; i<tokens.length;i++){
7 ans = 0;
8 if(tokens[i].equals("/")||tokens[i].equals("*")||tokens[i].equals("+")||tokens[i].equals("-")){
9 int b = res.pop();
10 int a = res.pop();
11 if(tokens[i].equals("/"))
12 ans += a/b;
13 else if(tokens[i].equals("+"))
14 ans += a+b;
15 else if(tokens[i].equals("-"))
16 ans += a-b;
17 else if(tokens[i].equals("*"))
18 ans += a*b;
19 res.push(ans);
20 }else{
21 res.push(Integer.parseInt(tokens[i]));
22 }
23 }
24 return res.pop();
25 }
2 if(tokens==null||tokens.length==0)
3 return 0;
4 int ans = 0;
5 Stack<Integer> res = new Stack<Integer>();
6 for(int i = 0; i<tokens.length;i++){
7 ans = 0;
8 if(tokens[i].equals("/")||tokens[i].equals("*")||tokens[i].equals("+")||tokens[i].equals("-")){
9 int b = res.pop();
10 int a = res.pop();
11 if(tokens[i].equals("/"))
12 ans += a/b;
13 else if(tokens[i].equals("+"))
14 ans += a+b;
15 else if(tokens[i].equals("-"))
16 ans += a-b;
17 else if(tokens[i].equals("*"))
18 ans += a*b;
19 res.push(ans);
20 }else{
21 res.push(Integer.parseInt(tokens[i]));
22 }
23 }
24 return res.pop();
25 }
。就对2,3,4,8,16等进制不知所措一样~~!人们习惯的运算方式是中缀表达式。而碰到前 缀,后缀方式。。迷茫其实仅仅是一种表达式子的方式而已(不被你习惯的方式)我这里教你一种也许你老师都没跟你讲的简单转换方式一个中缀式到其他式子的转 换方法~~这里我给出一个中缀表达式~a+b*c-(d+e)
第一步:按照运算符的优先级对所有的运算单位加括号~
((a+(b*c))-(d+e)) 式子变成拉:
第二步:转换中缀与后缀表达式
后缀:把运算符号移动到对应的括号后面
则变成拉:((a(bc)*)+(de)+)-
把括号去掉:abc*+de+- 后缀式子出现
发现没有,前缀式,后缀式是不需要用括号来进行优先级的确定的。
现在,你需要用计算机来实现这一过程,怎么样,是否有兴趣一试呢?如果答案是肯定的话,Let‘s go!”
以上内容引用自:http://puppypuppy2005.blog.163.com/blog/static/5204815620107523258709/
代码如下: