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
解题思路: 不用被他的名字吓唬到,这个表达式的意思是当碰到计算符时,计算之前出现的两个数字。有人说,那计算出来的数字放哪儿,这当然就是这道题目的考点了,就是采用什么样的数据结构,那么我们看到这道题目说操作的是前面两个字符,如果我们只用题目给的数组和指针来进行操作的话,就没有办法记录之前已经操作的字符和数字了,而且如果用这个方法代码量会非常大,所以我这里用了栈作为数据结构。为什么用栈?因为栈是先进后出,正好我们碰到操作符的时候是进行前面两个数字的操作,那样就能省去我们用多个指针记录当前index或者是用一个变量来记录之前计算的值。代码如下:
public class Solution {
public int evalRPN(String[] tokens) {
if(tokens == null || tokens.length == 0){
return 0;
}
<span style="white-space:pre"> </span>//用deque是因为deque查询和retrive 的时间更少
Deque<Integer> stack = new LinkedList<>();
for(int i = 0; i < tokens.length; i++){
switch (tokens[i]){
case "+":
stack.offerLast(stack.pollLast() + stack.pollLast());
break;
case "-":
int a = stack.pollLast();
int b = stack.pollLast();
stack.offerLast(b - a);
break;
case "*":
stack.offerLast(stack.pollLast() * stack.pollLast());
break;
case "/":
int c = stack.pollLast();
int d = stack.pollLast();
stack.offerLast(d / c);
break;
default:
stack.offerLast(Integer.parseInt(tokens[i]));
break;
}
}
return stack.pollLast();
}
}