视频讲解 使用两个 单调栈
表达式求值
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