LeetCode Evaluate Reverse Polish Notation

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) 来获得相关源码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值