Problem:
Implement a basic calculator to evaluate a simple expression string.
The expression string contains only non-negative integers, +
, -
, *
, /
operators and empty spaces . The integer division should truncate toward zero.
You may assume that the given expression is always valid.
Some examples:
"3+2*2" = 7 " 3/2 " = 1 " 3+5 / 2 " = 5
Note: Do not use the eval
built-in library function.
Analysis:
Solutions:
C++:
int SToI(const string& str)
{
int value = 0;
for(int i = 0; i < str.size(); ++i) {
value *= 10;
value += str[i] - '0';
}
return value;
}
int Compute(int left, int right, char op)
{
int value;
switch(op) {
case '+':
value = left + right;
break;
case '-':
value = left - right;
break;
case '*':
value = left * right;
break;
default :
value = left / right;
}
return value;
}
int calculate(string s) {
if(s.empty())
return 0;
stack<int> num_stack;
stack<char> op_stack;
for(int i = 0; i < s.size();) {
if(s[i] == ' ') {
++i;
continue;
} else if(s[i] >= '0' && s[i] <= '9') {
int j = i;
for(; j < s.size() && s[j] >= '0' && s[j] <= '9'; ++j);
num_stack.push(SToI(s.substr(i, j - i)));
i = j;
} else if(s[i] == '+' || s[i] == '-') {
while(!op_stack.empty()) {
int right = num_stack.top();
num_stack.pop();
int left = num_stack.top();
num_stack.pop();
int r = Compute(left, right, op_stack.top());
num_stack.push(r);
op_stack.pop();
}
op_stack.push(s[i++]);
} else {
if(!op_stack.empty() && (op_stack.top() == '*' || op_stack.top() == '/')) {
int right = num_stack.top();
num_stack.pop();
int left = num_stack.top();
num_stack.pop();
num_stack.push(Compute(left, right, op_stack.top()));
op_stack.pop();
}
op_stack.push(s[i++]);
}
}
while(!op_stack.empty()) {
int right = num_stack.top();
num_stack.pop();
int left = num_stack.top();
num_stack.pop();
num_stack.push(Compute(left, right, op_stack.top()));
op_stack.pop();
}
return num_stack.top();
}
Java
:
Python: