def cal(a: int, b: int, op: str) -> int:
    """根据运算符计算两个数的值"""
    if op == "+":
        return b + a
    elif op == "-":
        return b - a  # 注意顺序,b是先弹出的数,a是后弹出的数
    elif op == "*":
        return b * a
    else:
        raise ValueError(f"不支持的运算符: {op}")

class Solution:
    def solve(self, s: str) -> int:
        num_str = ""
        # 运算符优先级字典
        precedence = {"+": 1, "-": 1, "*": 2}
        op_stack = []
        num_stack = []

        i = 0
        while i < len(s):
            char = s[i]
            if char == ' ':  # 忽略空格
                i += 1
                continue

            if char in "0123456789":
                # 如果是数字,拼接成完整的数字字符串
                num_str += char
                # 检查下一个字符是否也是数字,以处理多位数
                while i + 1 < len(s) and s[i + 1] in "0123456789":
                    num_str += s[i + 1]
                    i += 1
                # 将拼接好的数字字符串转换为整数并压入数字栈
                num_stack.append(int(num_str))
                num_str = ""  # 重置数字字符串

            elif char == "(":
                op_stack.append(char)

            elif char == ")":
                # 遇到右括号,弹出运算符并计算,直到遇到左括号
                while op_stack and op_stack[-1] != "(":
                    op = op_stack.pop()
                    a = num_stack.pop()
                    b = num_stack.pop()
                    num_stack.append(cal(a, b, op))
                op_stack.pop()  # 弹出左括号,不进行计算

            elif char in "+-*":
                # 处理负数或正数开头的情况,或者括号后紧跟负数/正数
                if i == 0 or s[i-1] == '(' or s[i-1] in "+-*":
                    if char == '-': # 如果是负号
                        num_stack.append(0)
                    # 如果是正号,可以压入0也可以忽略,这里选择压入0保持逻辑统一
                    elif char == '+':
                        num_stack.append(0)

                # 弹出优先级高于或等于当前运算符的运算符进行计算
                while op_stack and op_stack[-1] != "(" and precedence[char] <= precedence[op_stack[-1]]:
                    op = op_stack.pop()
                    a = num_stack.pop()
                    b = num_stack.pop()
                    num_stack.append(cal(a, b, op))
                op_stack.append(char)
            i += 1

        # 处理栈中剩余的运算符
        while op_stack:
            op = op_stack.pop()
            a = num_stack.pop()
            b = num_stack.pop()
            num_stack.append(cal(a, b, op))

        # 数字栈中最后剩下的就是结果
        return num_stack[0] if num_stack else 0