您的位置:首页 > 编程语言 > Lua

LeetCode Evaluate Reverse Polish Notation

2016-05-17 21:36 302 查看

LeetCode解题之Evaluate Reverse Polish Notation

原题

对表达式的后缀形式(也称为逆波兰表达式)进行计算并返回结果。操作符只有加减乘除四种,操作数为一个整数或者一个表达式。

注意点:



例子:

输入: tokens = [“2”, “1”, “+”, “3”, “*”]

输出: 9

解题思路

后缀表达式的形式为
操作数1,操作数2,操作符
,也就是操作符要进行计算操作的两个数(或者表达式)在它的前方,所以在遍历列表的时候,我们要将前面的操作符压入栈中,当遇到操作符的时候,我们将它对应的操作数弹出并进行计算,计算结果可能是其他操作符的操作数,它原来是一个表达式,我们将该表达式的值计算出来了,所以应该把那个值继续压栈,遍历完整个列表的时候,计算结束。这里特别要注意的是除法操作,因为给的表达式都是合法的,所以不用考虑除数为零的情况,但这里的除法操作是针对整数的,会对结果进行去尾操作。对负数与整数的除法操作也与Python自带的计算方式不同,Python计算
-1//2
结果为-1,而在这里应该为0,所以要进行特殊的处理。

AC源码

class Solution(object):
def evalRPN(self, tokens):
"""
:type tokens: List[str]
:rtype: int
"""
stack = []
for token in tokens:
if token not in ("+", "-", "*", "/"):
stack.append(int(token))
else:
second = stack.pop()
first = stack.pop()
if token == "+":
stack.append(first + second)
elif token == "-":
stack.append(first - second)
elif token == '*':
stack.append(first * second)
else:
if first * second < 0:
stack.append(-(abs(first) // abs(second)))
else:
stack.append(first // second)
return stack.pop()

if __name__ == "__main__":
assert Solution().evalRPN(["2", "1", "+", "3", "*"]) == 9
assert Solution().evalRPN(["4", "13", "5", "/", "+"]) == 6
assert Solution().evalRPN(["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]) == 22


欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息