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 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
Example 3:
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
First Accept
使用python2时要注意,对于负数的除法会进行向上取整。比如6/-132 = -1
class Solution(object):
def evalRPN(self, tokens):
"""
:type tokens: List[str]
:rtype: int
"""
stack = []
operater = {'+', '-', '*', '/'}
for c in tokens:
if c in operater:
end = stack.pop()
start = stack.pop()
stack.append(str(int(eval(start+c+end))))
else:
stack.append(c)
print(stack)
return int(stack[-1])
s = Solution()
print(s.evalRPN(
["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]))
Fastest
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack = []
curr = None
operators = ['+', '-', '*', '/']
for ele in tokens:
if len(stack) >= 2:
if ele in operators:
b, a = stack.pop(), stack.pop()
if ele == '+':
curr = a + b
stack.append(curr)
elif ele == '-':
curr = a - b
stack.append(curr)
elif ele == '*':
curr = a * b
stack.append(curr)
elif ele == '/':
if a * b > 0:
curr = a // b
else:
curr = -(abs(a) // abs(b))
stack.append(curr)
else:
stack.append(int(ele))
else:
if ele in operators:
return None
else:
stack.append(int(ele))
return stack.pop()