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