# [LeetCode] 150. Evaluate Reverse Polish Notation 计算逆波兰表达式

2021年09月15日 阅读数：1

Evaluate the value of an arithmetic expression in Reverse Polish Notation.html

Valid operators are `+``-``*``/`. Each operand may be an integer or another expression.java

Note:python

• 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:express

```Input: ["2", "1", "+", "3", "*"]
Output: 9
Explanation: ((2 + 1) * 3) = 9
```

Example 2:app

```Input: ["4", "13", "5", "/", "+"]
Output: 6
Explanation: (4 + (13 / 5)) = 6
```

Example 3:ide

```Input: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
Output: 22
Explanation:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22```

Java:

```public class Solution {
public int evalRPN(String[] tokens) {
int a,b;
Stack<Integer> S = new Stack<Integer>();
for (String s : tokens) {
if(s.equals("+")) {
}
else if(s.equals("/")) {
b = S.pop();
a = S.pop();
}
else if(s.equals("*")) {
}
else if(s.equals("-")) {
b = S.pop();
a = S.pop();
}
else {
}
}
return S.pop();
}
}
```

Java:

```public int evalRPN(String[] a) {
Stack<Integer> stack = new Stack<Integer>();

for (int i = 0; i < a.length; i++) {
switch (a[i]) {
case "+":
stack.push(stack.pop() + stack.pop());
break;

case "-":
stack.push(-stack.pop() + stack.pop());
break;

case "*":
stack.push(stack.pop() * stack.pop());
break;

case "/":
int n1 = stack.pop(), n2 = stack.pop();
stack.push(n2 / n1);
break;

default:
stack.push(Integer.parseInt(a[i]));
}
}

return stack.pop();
}
```

Python:

```# Time:  O(n)
# Space: O(n)
import operator

class Solution:
# @param tokens, a list of string
# @return an integer
def evalRPN(self, tokens):
numerals, operators = [], {"+": operator.add, "-": operator.sub, "*": operator.mul, "/": operator.div}
for token in tokens:
if token not in operators:
numerals.append(int(token))
else:
y, x = numerals.pop(), numerals.pop()
numerals.append(int(operators[token](x * 1.0, y)))
return numerals.pop()

if __name__ == "__main__":
print(Solution().evalRPN(["2", "1", "+", "3", "*"]))
print(Solution().evalRPN(["4", "13", "5", "/", "+"]))
print(Solution().evalRPN(["10","6","9","3","+","-11","*","/","*","17","+","5","+"]))```

C++:

```class Solution {
public:
int evalRPN(vector<string> &tokens) {
if (tokens.size() == 1) return atoi(tokens[0].c_str());
stack<int> s;
for (int i = 0; i < tokens.size(); ++i) {
if (tokens[i] != "+" && tokens[i] != "-" && tokens[i] != "*" && tokens[i] != "/")
{
s.push(atoi(tokens[i].c_str()));
} else {
int m = s.top();
s.pop();
int n = s.top();
s.pop();
if (tokens[i] == "+") s.push(n + m);
if (tokens[i] == "-") s.push(n - m);
if (tokens[i] == "*") s.push(n * m);
if (tokens[i] == "/") s.push(n / m);
}
}
return s.top();
}
};
```

C++:

```class Solution {
public:
int evalRPN(vector<string>& tokens) {
int op = tokens.size() - 1;
return helper(tokens, op);
}
int helper(vector<string>& tokens, int& op) {
string s = tokens[op];
if (s == "+" || s == "-" || s == "*" || s == "/") {
int v2 = helper(tokens, --op);
int v1 = helper(tokens, --op);
if (s == "+") return v1 + v2;
else if (s == "-") return v1 - v2;
else if (s == "*") return v1 * v2;
else return v1 / v2;
} else {
return stoi(s);
}
}
};
```