Hello, I have similar style using two stacks but easy to understand( I think...)

But without reverse the input, that is run from left to right.

A little bit long..

class Solution {
public:
int calculate(string s) {
stack<int> operands;
stack<char> operators;
for (int i = 0, len = s.size(); i<len; i++){
if (s[i] == ' ') continue;
if (s[i] >= '0' && s[i] <= '9'){
int val = s[i]-'0';
while (i + 1 < len && s[i+1] >= '0' && s[i+1] <= '9'){
val = val * 10 + s[i + 1]-'0';
i++;
}
operands.push(val);
}
else{
if (operators.empty() || s[i] == '(')
operators.push(s[i]);
else{
if (operators.top() != '(')
calcUtil(operands, operators);
if (s[i] == ')')
operators.pop();
else
operators.push(s[i]);
}
}
}
while (operands.size()>1)
calcUtil(operands, operators);
return operands.top();
}
void calcUtil(stack<int> &operands, stack<char> &operators){
int operand2 = operands.top();
operands.pop();
int operand1 = operands.top();
operands.pop();
int tmp = (operators.top() == '+') ? operand1 + operand2 : operand1 - operand2;
operands.push(tmp);
operators.pop();
}
};