Basic Calculator II
class Solution {
private:
char op;
int num, pos;
public:
int getpriority(char op, bool in=false) {
int p = 0;
switch(op) {
case '(':
p = in? 1:4;
break;
case '+':
case '-':
p = 2;
break;
case '*':
case '/':
p = 3;
break;
case ')':
p = 1;
break;
case '$':
p = 0;
break;
}
return p;
}
bool token(const string &s) {
// return false means get a operator, true means get a operand
while (pos < s.length() && s[pos] == ' ') ++pos;
if (pos == s.length()) {
op = '$';
return false;
}
if (s[pos] >= '0' && s[pos] <= '9') {
num = 0;
while (pos < s.length() && s[pos] >= '0' && s[pos] <= '9') {
num = num * 10 + int(s[pos++] - '0');
}
return true;
}
op = s[pos++];
return false;
}
int eval(int a, int b, char op) {
int c = 0;
switch(op) {
case '+': c = a + b; break;
case '-': c = a - b; break;
case '*': c = a * b; break;
case '/': c = a / b; break;
}
return c;
}
int calculate(string s) {
pos = 0;
stack<int> nums;
stack<char> ops;
while(true) {
bool flag = token(s);
if (flag) {
nums.push(num);
} else {
int p = getpriority(op);
while (!ops.empty() && getpriority(ops.top(), true) >= p) {
char op2 = ops.top();
ops.pop();
if (op2 == '(') {
break;
}
int a = nums.top();
nums.pop();
int b = nums.top();
nums.pop();
nums.push(eval(b, a, op2));
}
if (op == '$') {
break;
}
if (op != ')') {
ops.push(op);
}
}
}
return nums.empty()? 0:nums.top();
}
};