C++/C 关于栈的小问题

输入的格式有以下几种的数学表达式:
expr := integer;
expr := (expr)+(expr);
expr := (expr)-(expr);

要求输入的时候没有任何的空格,可以读取 "(" ")" “+”和“-”
输入和输出的数字皆为int值。字符串总长度不超过10^6个字符

输出: 输出表达式的结果,为int值
例如:
(7)-((1)+(2)) ——>输出 4
((5)+(9))-((4)-(1)) ——> 输出11
(((((995)+(166))+((-142)+(12)))-((969)+(276)))-(354))-((((-255)+((((((-170)+(-646))+(-570))-((-797)+(913)))+(((((((((852)+(858))-(179))-(-392))+((-955)-(-151)))+(-548))+(128))-(91))+(((-998)+(-119))-(((163)-(656))+(196)))))-(((767)-((454)+((-615)-((-783)+((614)-(390))))))+((((-322)-(((-249)+(691))+(707)))-((-658)-((((-238)+((912)-(893)))-(((33)+(((-853)+(488))+(-630)))+((((134)-(299))-(-601))+(-255))))-((-746)-(((1)+(-913))+(-101))))))+(((((-141)-((802)-(-891)))+(-979))+(((16)-(579))-(94)))+(337))))))-(((((313)+((696)-(2)))+(483))+(((988)+((133)+(-76)))-(662)))-(((((-288)+((792)-(-813)))-(996))+(-249))+((((((-677)-(809))-((((-753)+((-580)-((-448)-(815))))+((((-136)-((575)+(-204)))-(889))-(-645)))+((-112)-(-280))))+((((-29)+((258)-(37)))+((-419)-(650)))-(((((-370)-(-276))+(-957))-(618))-((-506)-((((-624)-(-978))+(-168))+(627))))))+(((((866)+((-200)-(-404)))+(-472))-(-641))-(-4)))-(((((707)+(588))+((-594)-(266)))-(((-469)-(754))-(497)))-((((-522)-(-672))-((((-588)+(-450))-(871))-((12)+(281))))-(369)))))))+(-650))
——>输出859


#include <iostream>
#include <stack>
using namespace std;
int calculate(string s);
int main(){
    string s;
    cin >> s;
    int res = calculate(s);
    cout << res << endl;

}
int calculate(string s) {
        stack<int> ops;
        ops.push(1);
        int sign = 1;

        int ret = 0;
        int n = s.length();
        int i = 0;
        while (i < n) {
            if (s[i] == ' ') {
                i++;
            } else if (s[i] == '+') {
                sign = ops.top();
                i++;
            } else if (s[i] == '-') {
                sign = -ops.top();
                i++;
            } else if (s[i] == '(') {
                ops.push(sign);
                i++;
            } else if (s[i] == ')') {
                ops.pop();
                i++;
            } else {
                long num = 0;
                while (i < n && s[i] >= '0' && s[i] <= '9') {
                    num = num * 10 + s[i] - '0';
                    i++;
                }
                ret += sign * num;
            }
        }
        return ret;
    }