这个方法很巧妙 但是很容易出错 每次记录这次的符号或者数字 但是进行的运算是上一次的
并且很巧妙的是用sign来记录上一个是+ 还是- sign为 1 或者 -1 下次乘到结果上
然后就是注意数字可能不是个位的 要乘以十累加
还有最后一个数字不要忘了加上去
假如遇到( 就要将当前结果和sign push 同时要给res和sign reset
)的时候要先进行括号里面的最后一次运算 再出栈 进行括号外面的
public class Solution {
public int calculate(String s) {
if ( s == null || s.length() == 0 )
return 0;
s.replaceAll("\\s","");
int res = 0;
int sign = 1;
int num = 0;
Stack<Integer> stack = new Stack <Integer> ();
for ( int i = 0; i < s.length (); i ++ ){
if ( s.charAt(i) == '+' ){
res += sign * num;
num = 0;
sign = 1;
}
else if ( s.charAt(i) == '-' ){
res += sign * num;
num = 0;
sign = -1;
}
else if ( Character.isDigit( s.charAt(i)) ){
num = 10 * num + s.charAt(i) - '0';
}
else if ( s.charAt(i) == '(' ){
stack.push( res );
stack.push( sign );
res = 0;
sign = 1;
}
else if ( s.charAt(i) == ')'){
res += sign * num;
num = 0;
int prevSign = stack.pop();
int prevRes = stack.pop();
res = prevRes + prevSign * res;
}
}
if ( num != 0 )
res += sign * num;
return res;
}
}