参考资料:左神算法课
Evaluate the expression. Return an integer that represents the value of the expression.
Note that:
The valid operators are ‘+’, ‘-’, ‘*’, and ‘/’.
Each operand may be an integer or another expression.
The division between two integers always truncates toward zero.
There will not be any division by zero.
The input represents a valid arithmetic expression in a reverse polish notation.
The answer and all the intermediate calculations can be represented in a 32-bit integer.
Example 1:
Input: tokens = [“2”,“1”,“+”,“3”,“*”]
Output: 9
Explanation: ((2 + 1) * 3) = 9
思路:建立一个栈,依次把数放入。当遍历到运算符时,弹出两个数,计算结果并将其放入栈。最后的栈顶就是答案。
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for(String s:tokens)
{
if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/"))
{
com(stack,s);
}else{
stack.push(Integer.valueOf(s));
}
}
return stack.peek();// Amazing ! peek is faster than pop
}
public void com(Stack<Integer> stack, String s)
{
int n2 = Integer.valueOf(stack.pop());
int n1= Integer.valueOf(stack.pop());
int ans=0;
switch(s){
case "+":
ans=n1+n2;
break;
case "-":
ans=n1-n2;
break;
case "*":
ans=n1*n2;
break;
case "/":
ans=n1/n2;
break;
}
stack.push(ans);
}
public static int evalRPN_zuo(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for (String str : tokens) {
if (str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/")) {
compute(stack, str);
} else {
stack.push(Integer.valueOf(str));
}
}
return stack.peek();
}
public static void compute(Stack<Integer> stack, String op) {
int num2 = stack.pop();
int num1 = stack.pop();
int ans = 0;
switch (op) {
case "+":
ans = num1 + num2;
break;
case "-":
ans = num1 - num2;
break;
case "*":
ans = num1 * num2;
break;
case "/":
ans = num1 / num2;
break;
}
stack.push(ans);
}
}