题意:
根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
- 整数除法只保留整数部分。
- 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例
输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
输出: 22
解释:
((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
思想:建立一个栈,存储数字,当碰到运算符时,每次弹出两个运算,将结果再压入栈中。
class Solution:
def evalRPN(self, tokens):
"""
:type tokens: List[str]
:rtype: int
"""
stack = list() #创建栈
oper = ['+', '-', '*', '/']
for char in tokens:
if char not in oper: #数字入栈
stack.append(int(char))
else: #遇运算符则弹出栈顶两个元素
top1 = stack.pop()
top2 = stack.pop()
#将弹出元素进行指定运算后压入栈
if char == '+':
stack.append(top2 + top1)
elif char == '-':
stack.append(top2 - top1)
elif char == '*':
stack.append(top2 * top1)
elif char == '/':
stack.append(int(top2 / top1))
return stack.pop()
优化写法:利用计算模块operator
class Solution:
def evalRPN(self, tokens):
"""
:type tokens: List[str]
:rtype: int
"""
import operator
stack = list()
ops = { "+": operator.add, "-": operator.sub, "*": operator.mul, "/": operator.truediv}
for char in tokens:
if char in ops:
t1 = int(stack.pop())
t2 = int(stack.pop())
stack.append(ops[char](t2, t1))
else:
stack.append(char)
return stack.pop()