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.
public class Solution {
public int calculate(String s) {
if (s == null || s.length() == 0) {
return 0;
}
Stack<Integer> num = new Stack<>();
Stack<Character> symbol = new Stack<>();
s += "#";
boolean isNum = false;
int cnt = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ' ') {
continue;
}
char charAt = s.charAt(i);
if (Character.isDigit(charAt)) {
cnt = cnt * 10 + (charAt - '0');
isNum = true;
} else {
if (isNum) {
num.push(cnt);
cnt = 0;
isNum = false;
if (!symbol.isEmpty() && (symbol.peek() == '*' || symbol.peek() == '/')) {
char pop = symbol.pop();
int b = num.pop();
int a = num.pop();
if (pop == '*') {
num.push(a * b);
} else {
num.push(a / b);
}
}
}
if (charAt != '#') {
symbol.push(charAt);
}
}
}
if (!symbol.isEmpty()) {
int tmp = 0;
while (!symbol.isEmpty()) {
Character pop = symbol.pop();
int a = num.pop();
if (pop == '+') {
tmp += a;
} else {
tmp -= a;
}
}
num.push(tmp + num.pop());
}
return num.pop();
}
}