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