该题解使用了一个栈来处理带括号的表达式。首先,通过一个循环遍历整个字符串,使用变量curNum来维护当前的数字,使用curOp来表示当前的操作符(加号为1,减号为-1)。当遇到'('时,将当前的curNum和curOp存入栈中,并重置curNum和curOp,这样可以处理新的子表达式。当遇到')'时,将栈顶的元素(之前的curNum和curOp)取出,根据这些值计算括号内表达式的值。对于数字的处理,使用while循环连续读取字符直到非数字,计算出完整的数字并根据之前的curOp更新curNum。最终,在字符串遍历完成后,curNum将包含整个表达式的计算结果。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def calculate(self, s: str) -> int:
i, curNum, curOp, stack = 0, 0, 1, []
while i < len(s):
if s[i] == '+':
curOp = 1 # 设置当前操作为加法
elif s[i] == '-':
curOp = -1 # 设置当前操作为减法
elif s[i] == '(': # 遇到左括号,将当前状态入栈
stack.append((curNum, curOp))
curNum, curOp = 0, 1 # 重置当前数和操作为默认状态
elif s[i] == ')': # 遇到右括号,计算括号内表达式的值
ops = stack.pop()
curNum = ops[0] + ops[1] * curNum
elif s[i] != ' ': # 处理数字
k = 0
while i < len(s) and s[i] not in ' +-)':
k = k * 10 + int(s[i])
i += 1
curNum = curNum + curOp * k # 根据当前操作更新curNum
continue # 因为i在内部循环中已更新,跳过外层循环的i增加
i += 1 # 移动到下一个字符
return curNum # 返回计算结果