[LeetCode]227. Basic Calculator II

227. Basic Calculator II

题意:和1相比,增加了乘号和除法,不过反而把括号去掉了,求表达式结果。

下面是基于Python2,因为LeetCode只允许Python2,需要注意的是,//得到的是它们的商再向下取整,特别是负数的时候。比如:

print 3//2  # 1
print -3//2  # -2

思路:使用sign保存上一个表达式的运算符,如果+或者-,则加入到栈中,如果是*或者/,则将弹出的运算符左边的值乘以当前值然后将运算的结果再加入到栈中,最后进行一个sum即可。

class Solution(object):
    def calculate(self, s):
        if not s:
            return "0"
        stack, num, sign = [], 0, "+"
        for i in range(len(s)):
            if s[i].isdigit():
                num = num * 10 + ord(s[i]) - ord("0")
            if (not s[i].isdigit() and not s[i].isspace()) or i == len(s) - 1:
                if sign == "-":
                    stack.append(-num)
                elif sign == "+":
                    stack.append(num)
                elif sign == "*":
                    stack.append(stack.pop() * num)
                else:
                    tmp = stack.pop()
                    if tmp // num < 0 and tmp % num != 0:
                        stack.append(tmp // num + 1)
                    else:
                        stack.append(tmp // num)
                sign = s[i]
                num = 0
        return sum(stack)
posted @ 2017-08-26 13:21  banananana  阅读(141)  评论(0)    收藏  举报