class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    int precedence(char op)
    {
        if(op=='+'||op=='-') return 1;
        if(op=='*'||op=='/') return 2;
        return 0;
    }
    int applyOp(int a,int b,char op)
    {
        switch(op)
        {
            case '+':return a+b;
            case '-':return a-b;
            case '*':return a*b;
            case '/':return a/b;
        }
        return 0;
    }
    int solve(string s) {
        // write code here
        stack<int> value;
        stack<char> ops;
        for(int i=0;i<s.length();i++)
        {
            if(s[i]>='0'&&s[i]<='9')
            {
                int a=s[i]-'0';
                while(i+1<s.length()&&s[i+1]>='0'&&s[i+1]<='9')
                {
                    a=a*10+s[i+1]-'0';
                    i++;
                }
                value.push(a);
            }
            //处理负号
            else if(s[i]=='-'&&(i==0||s[i-1]=='('))
            {
                int a=s[i]-'0';
                while(i+1<s.length()&&s[i+1]>='0'&&s[i+1]<='9')
                {
                    a=a*10+s[i+1]-'0';
                    i++;
                }
                value.push(-a);
            }
            else if(s[i]=='(')
            {
                ops.push(s[i]);
            }
            else if(s[i]==')')
            {
                while(!ops.empty()&&ops.top()!='(')
                {
                    int v2=value.top();
                    value.pop();
                    int v1=value.top();
                    value.pop();
                    char o=ops.top();
                    ops.pop();
                    value.push(applyOp(v1,v2,o));
                }
                if(!ops.empty()) ops.pop();
            }
            else
            {
                while(!ops.empty()&&precedence(ops.top())>=precedence(s[i]))
                {
                    int v2=value.top();
                    value.pop();
                    int v1=value.top();
                    value.pop();
                    char o=ops.top();
                    ops.pop();
                    value.push(applyOp(v1,v2,o));
                }
                ops.push(s[i]);
            }
        }
        while(!ops.empty())
        {
            int v2=value.top();
                    value.pop();
                    int v1=value.top();
                    value.pop();
                    char o=ops.top();
                    ops.pop();
                    value.push(applyOp(v1,v2,o));
        }
        return value.top();
    }
};