Problem 150. Evaluate Reverse Polish Notation
-
题目描述
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
Input: ["4", "13", "5", "/", "+"] Output: 6 Explanation: (4 + (13 / 5)) = 6
-
解题思路
本题要计算一个逆波兰式的结果,所谓逆波兰式就是操作数放前面,运算符放最后,例如 “3+2” 的逆波兰式是 “3 2 +” 。求解逆波兰式可以用栈:遍历数组 tokens,遇到一个运算符就弹出栈顶的两个元素进行运算,并将结果压入栈中;否则直接将遍历的元素压入栈中。 -
代码实现
该算法的 C++ 和 Python 代码如下:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
int len = tokens.size();
if(len == 1)
return stoi(tokens[0]);
stack<int> s;
for(int i = 0; i < len; ++i){
if(tokens[i] != "+" && tokens[i] != "-" && tokens[i] != "*" && tokens[i] != "/")
s.push(stoi(tokens[i]));
else{
int num2 = s.top();
s.pop();
int num1 = s.top();
s.pop();
if(tokens[i] == "+")
s.push(num1 + num2);
else if(tokens[i] == "-")
s.push(num1 - num2);
else if(tokens[i] == "*")
s.push(num1 * num2);
else if(tokens[i] == "/")
s.push(num1 / num2);
}
}
return s.top();
}
};
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
size = len(tokens)
if size == 1:
return int(tokens[0])
stack = []
for s in tokens:
if s != "+" and s != "-" and s != "*" and s != "/":
stack.append(int(s))
else:
num2 = stack.pop()
num1 = stack.pop()
if s == "+":
stack.append(num1 + num2)
elif s == "-":
stack.append(num1 - num2)
elif s == "*":
stack.append(num1 * num2)
else :
stack.append(int(num1 / num2))
return stack.pop()