先将字符串转换成后缀表达式,再对后缀表达式进行计算。
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])