题目
根据逆波兰表示法,求表达式的值。
有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 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: List[str]) -> int:
# print(tokens[0])
res = []
for i in tokens:
# print(res)
if i.isdigit():
res.append(int(i))
elif i[0]=='-' and len(i)!=1:
res.append(-int(i[1:]))
elif i=='+':
res.append(res.pop()+res.pop())
elif i=='-':
res.append(-res.pop()+res.pop())
elif i=='*':
res.append(int(res.pop())*int(res.pop()))
elif i=='/':
tmp1=int(res.pop())
tmp2=int(res.pop())
if (tmp2<0 and tmp1<0) or (tmp2>0 and tmp1>0) :
res.append(tmp2//tmp1)
else:
res.append(-(-tmp2//tmp1))
return res[0]
试了python的匿名函数,以为会更快,实际没有。
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
maps={
'+':lambda a, b: a+b,
'-':lambda a, b: a-b,
'*':lambda a, b: a*b,
'/':lambda a, b: a//b if (a>0 and b>0) or (a<0 and b<0) else -(-a//b) ,
}
res = []
for i in tokens:
# print(res)
if i.isdigit():
res.append(int(i))
elif i[0]=='-' and len(i)!=1:
res.append(-int(i[1:]))
elif i in maps:
b=res.pop()
a=res.pop()
res.append(maps[i](a,b))
return res[0]