思路:
res用来表示一个括号内的运算结果,如果遇到 ' ) ' ,则表示这个括号结束,取出栈中的符号和结果,将res赋值给num。
一个表达式分为三部分:左边表达式①,运算符③,右边表达式②
一个只包含加减和括号的表达式,我们可以从左到右计算,遇到括号就先算括号里面的。具体来说就是先计算左边的表达式,再计算右边表达式,最后根据运算符,计算①和②的计算。
public static int calculate(String s){
int res=0;
int num=0;
int sign=1;
Stack<Integer> stack=new Stack<>();
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(c==' ') continue;
if(c>='0'&&c<='9'){
num=num*10+c-'0';
if(i+1<s.length()&&s.charAt(i+1)>='0'&&s.charAt(i+1)<='9'){
continue;
}
}
else if(c=='+'||c=='-'){
num=0;
sign=c=='+'?1:-1;
}
else if(c=='('){
stack.push(res);
stack.push(sign);
num=0;
sign=1;
}
else if(c==')'){
sign=stack.pop();
num=res;
res=stack.pop();
}
res+=sign*num;
}
return res;
}