class Solution {
public:
  //对加法乘除进行优先级的标号
    unordered_map<char, int> order = {
        {'+', 1},
        {'-', 1},
        {'*', 2},
        {'/', 2}
    };

    int calculate(string s) { 
	  //使用两个栈分别存储数字和运算符;
        stack<int> nums;
        stack<char> ops;
        int n = 0;
        bool parsingNumber = false;
		
		//遇到数字进行构造数字,遇到符号进行计算,先计算栈中优先级高或相等的运算符,
		//栈中最多两个运算符,
        for(int i=0; i<s.size(); ++i){
            char c = s[i];

            if(isdigit(c)){
                n = n*10 + (c - '0'); //字符转数字
                parsingNumber = true;
            }

            if(!isdigit(c)  || i==s.size()-1){
                if(parsingNumber){  //数字进栈
                    nums.push(n);
                    n = 0;
                    parsingNumber = false;
                }

                if(i < s.size()-1 || !isdigit(c)){ //计算栈中保留的运算
                    while(!ops.empty() && order[ops.top()] >= order[c]){
                        compute(nums, ops);
                    }
                    ops.push(c);
                }
            }
        }

        while(!ops.empty()){ //可能包含存在
            compute(nums, ops);
        }

        return nums.top();
    }
  
private:
    void compute(stack<int>& nums, stack<char>& ops){
        int b = nums.top(); nums.pop();
        int a = nums.top(); nums.pop();
        char op = ops.top(); ops.pop();

        switch (op) {
            case '+':nums.push(a+b);break;
            case '-':nums.push(a-b);break;
            case '*':nums.push(a*b);break;
            case '/':nums.push(a/b);break;
        }
    }
};