思路
利用栈(stack)来保存进入括号前的计算状态(包括当前计算结果和符号),以便在括号结束后正确恢复计算上下文。代码通过遍历字符串,识别数字、加号、减号和括号。遇到数字时构造完整数值;遇到加减号时将上一个数与符号累加到当前结果中,并更新符号;遇到左括号时将当前结果和符号压栈,重置为括号内的新表达式;遇到右括号时将括号内结果乘以括号前符号并加到括号前的结果上。最终再将最后一个数加上,得到总结果。整个过程遵循从左到右、遇括号递归的求值逻辑。
class Solution:def calculate(self, s: str) -> int:stack=[] #来存放括号外的结果和符号result=0 #当前累计的计算结果number=0 #当前正在解析的数字sign=1 #当前数字前的符号for char in s:if char.isdigit():number=number*10+int(char)elif char=='+':result+=sign*numbernumber=0sign=1 #下一个数是正数elif char=='-':result+=sign*numbernumber=0sign=-1 #下一个是负数elif char=='(':stack.append(result)#保持当前计算状态stack.append(sign) result=0sign=1elif char==')':result+=sign*numbernumber=0result*=stack.pop() #拿出来的是进入括号之前的signresult+=stack.pop() #拿上一个结果result+=sign*numberreturn result