题目:Evaluate Reverse Polish Notation
难度:medium
问题描述:
Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +
, -
, *
, /
. Each operand may be an integer or another expression.
Note:
- Division between two integers should truncate toward zero.
- The given RPN expression is always valid. That means the expression would always evaluate to a result and there won't be any divide by zero operation.
Example 1:
Input: ["2", "1", "+", "3", "*"] Output: 9 Explanation: ((2 + 1) * 3) = 9
Example 2:
Input: ["4", "13", "5", "/", "+"] Output: 6 Explanation: (4 + (13 / 5)) = 6
解题思路:逆波兰表达式求值。逆波兰表达式,意思是把操作数放在前面,而把操作符放在操作数后面。比如2,1,+,代表对2和1进行+操作。求解方法很简单,使用一个stack保存操作数,遇到操作符则从中取出最近的两个操作数,然后进行相应运算后再压入栈。
代码如下:
public static int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for(String w : tokens){
if(isNum(w)){
stack.push(Integer.parseInt(w));
}else{
int tail = stack.pop();
int head = stack.pop();
switch(w){
case "+":
stack.push(tail+head);
break;
case "-":
stack.push(head-tail);
break;
case "*":
stack.push(tail*head);
break;
case "/":
stack.push(head/tail);
break;
}
}
}
return stack.pop();
}
private static boolean isNum(String str){
if(str.length()!=1){
return true;
}else{
char c = str.charAt(0);
return (c!='+')&&(c!='-')&&(c!='*')&&(c!='/');
}
}