150.Evaluate Reverse Polish Notation
===
###### tags: `Medium`,`Array`,`Math`,`Stack`
[150. Evaluate Reverse Polish Notation](https://leetcode.com/problems/evaluate-reverse-polish-notation/)
### 題目描述
Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are `+`, `-`, `*`, and `/`. Each operand may be an integer or another expression.
**Note** that division between two integers should truncate toward zero.
It is guaranteed that the given RPN expression is always valid. That means the expression would always evaluate to a result, and there will not be any division by zero operation.
### 範例
**Example 1:**
```
Input: tokens = ["2","1","+","3","*"]
Output: 9
Explanation: ((2 + 1) * 3) = 9
```
**Example 2:**
```
Input: tokens = ["4","13","5","/","+"]
Output: 6
Explanation: (4 + (13 / 5)) = 6
```
**Example 3:**
```
Input: tokens = ["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
```
**Constraints**:
* 1 <= `tokens.length` <= 10^4^
* `tokens[i]` is either an operator: `"+"`, `"-"`, `"*"`, or `"/"`, or an integer in the range `[-200, 200]`.
### 解答
#### C#
```csharp=
public class Solution {
public int EvalRPN(string[] tokens) {
Stack<int> operands = new();
var operators = new string[] { "+", "-", "*", "/" };
foreach (string token in tokens)
{
if (operators.Contains(token))
{
int operand2 = operands.Pop();
int operand1 = operands.Pop();
operands.Push(Calc(operand1, operand2, token));
}
else
{
operands.Push(int.Parse(token));
}
}
return operands.Pop();
static int Calc(int operand1, int operand2, string oper) => oper switch
{
"+" => operand1 + operand2,
"-" => operand1 - operand2,
"*" => operand1 * operand2,
"/" => operand1 / operand2,
_ => throw new ArgumentException(null, nameof(oper)),
};
}
}
```
>[name=Jim][time= Dec 17, 2022]
#### Python
```python=
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stk = []
for token in tokens:
if token in "+-*/":
num2 = stk.pop()
num1 = stk.pop()
if token == '+':
stk.append(num1 + num2)
elif token == '-':
stk.append(num1 - num2)
elif token == '*':
stk.append(num1 * num2)
elif token == '/':
stk.append(int(num1 / num2))
else:
stk.append(int(token))
return stk.pop()
```
### Reference
[回到題目列表](https://hackmd.io/@Marsgoat/leetcode_every_day)