视频讲解 使用两个 单调栈

表达式求值

http://www.nowcoder.com/questionTerminal/c215ba61c8b1443b996351df929dc4d4

class Solution:
    def solve(self , s ):
        # 用于存储 数字
        number = []
        # 用于存储 运算操作
        operate = []
        # 存储数字
        pre = ''
        # 遍历 每个字符
        for i in s:
            # 判断 字符 是否 属于 操作符 或者 括号
            if i == '(' or i == ')' or i == '+' or i == '-' or i == '*':
                # 如果 运算符 之前有 数字
                if pre != '':
                    # 把 字符串数字 转化为 数字
                    number.append(int(pre))
                    # 先做 乘法运算
                    if operate and operate[-1] == '*':
                        # 弹出 运算符
                        op = operate.pop()
                        # 弹出 操作数字
                        num2 = number.pop()
                        num1 = number.pop()
                        # 计算 两数
                        num3 = self.cal(num1, num2, op)
                        # 将结果 添加到 数组栈中
                        number.append(num3)
                    if operate and operate[-1] == '-':
                        # 将 -号 转化为 负数
                        operate[-1] = '+'
                        number[-1] = (-1)*number[-1]
                # 重新开始 拼接
                pre = ''
                # 添加 操作数
                operate.append(i)
            else:
                # 拼接 数字
                pre += i
                
            # 右括号 需要 运算 括号内的 内容
            if operate and operate[-1]  == ')':
                # 弹出 右括号
                operate.pop()
                # 开始 运算 括号内的 数字
                while operate and operate[-1] != '(':
                    op = operate.pop()
                    num2 = number.pop()
                    num1 = number.pop()
                    num3 = self.cal(num1, num2, op)
                    number.append(num3)
                # 弹出 左括号
                operate.pop()
                # 将括号中前 负号 数字 转化为 负数
                if operate and operate[-1] == '-':
                    operate[-1] = '+'
                    number[-1] = (-1)*number[-1]
                    
        # 拼接最后一个数字
        if pre != '':
            number.append(int(pre))
        # 负号 转 负数
        if operate and operate[-1] == '-':
            operate[-1] = '+'
            number[-1] = (-1)*number[-1]
        
        # 剩下的运算
        while operate:
            op = operate.pop()
            num2 = number.pop()
            num1 = number.pop()
            num3 = self.cal(num1, num2, op)
            number.append(num3)
        return number[0]
    
    def cal(self, num1, num2, op):
        if op == '+':
            return num1 + num2
        if op == '*':
            return num1 * num2
        


全部评论

相关推荐

勤奋努力的椰子这就开摆:美团骑手在美团工作没毛病
投递美团等公司10个岗位
点赞 评论 收藏
分享
11-03 14:38
重庆大学 Java
AAA求offer教程:我手都抬起来了又揣裤兜了
点赞 评论 收藏
分享
6 收藏 评论
分享
牛客网
牛客企业服务