Implement a basic calculator to evaluate a simple expression string.
The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .
You may assume that the given expression is always valid.
Some examples:
"1 + 1" = 2 " 2-1 + 2 " = 3 "(1+(4+5+2)-3)+(6+8)" = 23
Note: Do not use the eval built-in library function.
一般是无法顺序执行、有些数据无法处理、需要回头再来处理时用到栈。在这个计算器中,如果只有‘+’,'-'运算,可以顺序执行。碰到(),需要把括号里整个表达式算出来,因此对()要用栈来处理。
对含有+ - * /的运算符,因为* /的优先级高于+ -,碰到了* /,前一个运算符若是+ 或者-,它需要延迟计算,因此对所有都要用到栈。
public class Solution {
public int calculate(String s) {
Stack<Integer> nums = new Stack<Integer>();
Stack<Character> ops = new Stack<Character>();
int re = 0, num = 0;
char op = '+';
for (int i = 0; i < s.length(); i++) {
switch (s.charAt(i)) {
case '+':
case '-':
if (op == '+') {
re = re + num;
} else {
re = re - num;
}
num = 0;
op = s.charAt(i);
break;
case '(':
nums.push(re);
ops.push(op);
re = 0;
op = '+';
break;
case ')':
if (op == '+') {
re = re + num;
} else {
re = re - num;
}
num = 0;
char c = ops.pop();
int prev = nums.pop();
if (c == '+') {
re = prev + re;
} else {
re = prev - re;
}
break;
case ' ':
break;
default:
num = 10 * num + s.charAt(i) - '0';
}
}
if (num != 0) {
if (op == '+') {
return re + num;
} else {
return re - num;
}
}
return re;
}
}