先将字符串转换成后缀表达式,再对后缀表达式进行计算。
class Solution:
def solve(self , s: str) -> int:
# return eval(s)
# 定义操作符优先级,然后写出字符串后序表达式进行计算
opt = {'(':3, '*':2, '+':1, '-':1}
s1 = [] # 存操作符+-*()
s2 = [] # 存后缀表达式
num = '' # 多位数字字符拼接变量
for c in s:
if c not in '+-*()': # 避开数字超过10的坑,数字超过十则占多个字符,将两两操作符中间字符拼接
num += c
else :
if num: # 遇到操作符,如果之前有拼接过数字字符,则入栈s2
s2.append(num)
num = ''
if s1: # 栈s1内有操作符,判断栈顶操作符与当前字符的关系
if c == ')': # 遇到右括号,表示有一对括号被遍历完,则栈s1中这对括号间操作符必同级,逆序入栈s2即可
while s1[-1] != '(':
s2.append(s1.pop())
s1.pop() # 弹出')'对应的'(',并且不对')'入栈s1,continue
continue
elif opt[s1[-1]] >= opt[c] and s1[-1] != '(': # s1栈顶操作符优先级不低于当前操作符,则将该操作符入到栈s2
s2.append(s1.pop())
s1.append(c)
else:
s1.append(c)
# 检测是否还有num未入栈
if num:
s2.append(num)
# s1中剩余操作符都是同级,逆序入栈s2即可,完成后s2即为原字符串的后缀表达式
while s1:
s2.append(s1.pop())
s1 = []
# 遍历s2中后缀表达式,遇到值则入栈s1,遇到操作符,则弹出s1栈顶两个元素做计算,计算完成后结果入栈s1,接着操作
for c in s2:
if c in '+-*':
num2 = s1.pop()
num1 = s1.pop()
num = eval(num1+c+num2)
s1.append(str(num))
else:
s1.append(c)
return int(s1[0])

京公网安备 11010502036488号