-
Notifications
You must be signed in to change notification settings - Fork 0
/
Evaluate_Reverse_Polish_Notation.py
72 lines (53 loc) · 2.19 KB
/
Evaluate_Reverse_Polish_Notation.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# 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 <= 104
# tokens[i] is either an operator: "+", "-", "*", or "/", or an integer in the range [-200, 200].
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
# we will use a stack: if we meet a number, we push it into the stack
# if we meet an operation, we pop the last 2 numbers and apply the operation
# then we push the result
stack = []
operations = ['+', '-', '*', '/']
for token in tokens:
# if the token is an operation
if token in operations:
# we pop two operands from stack and apply the operation
second = int(stack.pop())
first = int(stack.pop())
if token == '+':
result = first + second
elif token == '-':
result = first - second
elif token == '*':
result = first * second
else:
result = int(first / second)
# now we push the result back to the stack
stack.append(result)
else:
stack.append(token)
# we know at this point, there is only one number in the stack
return stack[0]