// 演算法 / Algorithm:
// 與 C 版相同：單次掃描，sign 記正負，res 累積當前層；'(' 時把 (res, sign)
// 推入堆疊並重置，')' 時結算並折回外層。只有加減與括號，無優先級問題。
// Same as the C version: one pass; push (res, sign) at '(', pop & fold at ')'.

#include <string>   // std::string
#include <stack>    // std::stack（封裝好的後進先出容器）/ ready-made LIFO container
#include <utility>  // std::pair（一次存兩個值）/ to store two values together

class Solution {
public:
    int calculate(std::string s) {
        // stack 存放 pair<外層res, 括號的sign>，遇到 '(' push、')' pop。
        // Stack of pair<outer res, group sign>; pushed at '(', popped at ')'.
        std::stack<std::pair<int,int>> st;

        long long res = 0;   // 當前層累積；用 long long 多一層保險避免中途溢位 / running total (extra-wide for safety)
        int sign = 1;        // 下一個數字的正負 / sign of next number
        long long num = 0;   // 正在拼接的數字 / number being built

        for (char c : s) {            // range-for：依序取出每個字元 / range-based for over each char
            if (std::isdigit(static_cast<unsigned char>(c))) {  // 是數字嗎 / is digit? (cast 避免負值 UB / safe cast)
                num = num * 10 + (c - '0');   // 一位一位拼成整數 / build multi-digit number
            } else if (c == '+') {            // 加號 / plus
                res += sign * num;            // 結算前一數字 / settle previous number
                num = 0;                      // 重置 / reset
                sign = 1;                     // 下一個為正 / next positive
            } else if (c == '-') {            // 減號或一元負號 / minus (binary or unary)
                res += sign * num;            // 結算 / settle
                num = 0;                      // 重置 / reset
                sign = -1;                    // 下一個為負 / next negative
            } else if (c == '(') {            // 左括號 / open paren
                st.emplace(static_cast<int>(res), sign); // 把 (res, sign) 直接就地建構入堆疊 / push pair in place
                res = 0;                      // 內層重新累積 / fresh slate
                sign = 1;                     // 內層預設正 / inner starts positive
            } else if (c == ')') {            // 右括號 / close paren
                res += sign * num;            // 結算括號內最後一個數字 / settle last inner number
                num = 0;                      // 重置 / reset
                auto [outerRes, groupSign] = st.top();  // 結構化綁定一次取出兩個值 / structured binding
                st.pop();                     // 彈出 / pop the saved pair
                res = outerRes + groupSign * res;       // 折回外層 / fold inner back into outer
            }
            // 空白被以上條件略過 / spaces are ignored by all branches
        }

        res += sign * num;                    // 結算最後一個未加入的數字 / settle final pending number
        return static_cast<int>(res);         // 題目保證結果落在 32-bit / answer fits in int
    }
};
