class Solution {
public:
    long nextNum(string s, int& i){
        long num;
        int base=0;
        while(i<s.length()&&s[i]>='0'&&s[i]<='9')
            num = num*pow(10, base++)+(s[i++]-'0');

        return num;
    }

    void compute(stack<long>& numStack, stack<char>& charStack){
        long num1=numStack.top();
        numStack.pop();
        long num2=numStack.top();
        numStack.pop();
        if(charStack.top()=='+')
            numStack.push(num1+num2);
        if(charStack.top()=='-')
            numStack.push(num2-num1);
        charStack.pop();
    }

    int calculate(string s) {
        stack<long> numStack;
        stack<char> charStack;
        int i=0;
        while(i<s.length()){
            char c = s[i];
            if(c=='+'||c=='-'){
                charStack.push(c);
                i++;
                continue;
            }
            if(c=='('){
                charStack.push(c);
                i++;
                continue;
            }
            if(c==')'){
                charStack.pop();
                if(!charStack.empty()&&(charStack.top()=='+'||charStack.top()=='-'))
                    compute(numStack, charStack);
                i++;
                continue;
            }
            if(c>='0'&&c<='9'){
                long num = nextNum(s, i);
                numStack.push(num);
                if(!charStack.empty()&&(charStack.top()=='+'||charStack.top()=='-'))
                    compute(numStack, charStack);
                continue;
            }
            if(c==' '){
                i++;
                continue;
            }
        }
        return numStack.top();
    }
};