[LeetCode]224. Basic Calculator

224. Basic Calculator

思路:提前准备一个装满两位操作符的运算符栈,分别用于计算开始的结果,一个用于之后的运算符,保证每一个数字都拥有自己的运算符(不管括号),将每一位数乘以弹出的运算符的结果累加计算最终结果。

class Solution(object):    
    def calculate(self, s):
        """
        :type s: str
        :rtype: int
        """
        i = 0
        total = 0
        ops = [1, 1]
        while i < len(s):
            if not s[i].isspace():
                if s[i].isdigit():
                    start = i
                    while i < len(s) and s[i].isdigit():
                        i += 1
                    total += ops.pop() * int(s[start:i])
                    continue
                elif s[i] in '+-(':
                    ops.append(ops[-1] * (1, -1)[s[i]=='-'])
                elif s[i] == ')':
                    ops.pop()
            i += 1
        return total

同样是栈,下面的做法和上面不同的地方在于,在遇见括号的时候,是将之前的结果和括号的符号弹入栈中保存下来,在处理括号完的时候,将弹出的符号对应括号计算的结果,再累加上弹出的之前计算的届结果,这种方法更容易进行扩展,比如后面可能还会有*或者/的情况,而上一种方法只能处理同等优先级的运算符。

class Solution(object):
    def calculate(self, s):
        """
        :type s: str
        :rtype: int
        """
        res, num, flag = 0, 0, 1
        stack = []
        for c in s:
            if c.isdigit():
                # 保存之前的num,计算当前的num
                num = 10*num+ord(c)-ord('0')
            elif c in '+-':
                res += flag*num
                num = 0
                flag = (1, -1)[c == '-']
            elif c == '(':
                # 将现在的结果和括号的符号弹入保存下来,方便以后取出使用
                stack.append(res)
                stack.append(flag)
                # 重置res和flag,以便计算括号中的结果
                res = 0
                flag = 1
            elif c==')':
                # 累加括号中的最后一位数
                res += flag*num
                # 取出之前保存括号外的符号
                scope_res = stack.pop() * res
                # 取出括号外的和,和括号内的和进行累加
                res = stack.pop() + scope_res
                num = 0
        res += flag*num
        return res
posted @ 2017-08-26 11:54  banananana  阅读(103)  评论(0编辑  收藏  举报