class Solution:
    def calculate(self, s: str) -> int:
        stack = [0]     # stack of partial results
        sign = 1        # current sign
        num = 0
 
        for c in s:
            if c.isdigit():
                num = num * 10 + int(c)
            elif c in "+-":
                stack[-1] += sign * num
                sign = 1 if c == "+" else -1
                num = 0
            elif c == "(":
                stack.extend([sign, 0])  # push sign, new partial sum
                sign, num = 1, 0
            elif c == ")":
                stack[-1] += sign * num  # finish inside number
                val = stack.pop()        # current subtotal
                stack[-1] += stack.pop() * val
                sign, num = 1, 0
 
        return stack[-1] + sign * num