class Solution {
public:
stack<int> nums;
stack<char> op;
void calc() {
int a = nums.top();
nums.pop();
int b = nums.top();
nums.pop();
switch (op.top()) {
case '+':
nums.push(b + a);
break;
case '-':
nums.push(b - a);
break;
case '*':
nums.push(b * a);
break;
case '/':
nums.push(b / a);
break;
}
}
int calculate(string s) {
unordered_map<char, int> pr;
pr['+'] = pr['-'] = 1, pr['*'] = pr['/'] = 2;
for (int i = 0; i < s.size(); i++) {
if (s[i] == ' ') continue;
if ('0' <= s[i] && s[i] <= '9') {
int t = 0, j = i;
while (j < s.size() && '0' <= s[j] && s[j] <= '9') {
t = t * 10 + (s[j] - '0'); // first subtraction, second add (over flow)
j++;
}
nums.push(t);
i = j - 1;
} else {
while (op.size() && pr[op.top()] >= pr[s[i]]) {
calc();
op.pop();
}
op.push(s[i]);
}
}
while (op.size()) {
calc();
op.pop();
}
return nums.top();
}
};