题目:
求在 逆波兰表示法 中算术表达式的值。
有效的运算符号包括 +
, -
, *
, /
。每个运算对象可以是整数,也可以是另一个逆波兰计数表达。
例如:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
分析:
- 建立运算符号集合
- 遍历字符串,遇到数字字符,转换为整数压入栈中,遇到运算符,弹出栈中最近压入的数字,运算后将结果压入栈中
- 遍历结束栈中元素即为计算结果
代码:
class Solution(object):
def evalRPN(self, tokens):
"""
:type tokens: List[str]
:rtype: int
"""
def op(char,a,b):
if char == '+':
return a + b
elif char == '-':
return a - b
elif char == '*':
return a * b
else:
if a:
sign = (a * b) / abs(a * b)
else:
sign = 1
return sign * (abs(a) / abs(b))
opSet = set('+-*/')
numStack = []
for x in tokens:
if x in opSet:
# print x
op2 = numStack.pop()
op1 = numStack.pop()
numStack.append(op(x,op1,op2))
else:
numStack.append(int(x))
# print numStack
return numStack[-1]
思考:
- 此题目的测试算例未考虑两整数相除,结果为负时,不同语言对结果取整的差异
- 以上算法中除法运算为为了适应测试算例,商为负数时,采取了小数去尾取整