栈(计算表达式)
import java.util.*;
public class Solution {
public int calculate (String s) {
//创建一个栈,用于存每个数字的数值和符号位
Stack<Integer>stack1=new Stack<>();
//num存每个数字的数值,sign存每个数字对应的符号位,res存结果
int num=0,res=0,sign=1;
for(int i=0;i<s.length();i++){
//如果是多位数字,就求出来
if(s.charAt(i)>='0'&&s.charAt(i)<='9'){
num=num*10+(s.charAt(i)-'0');
//如果是加号,就将之前对应的数值累加上去
//并且将数值变量清0,后一个数的符号位记作1,表示后面是正数
}else if(s.charAt(i)=='+'){
res+=sign*num;
num=0;
sign=1;
//累加上一个数
//将数值位清0,由于是负号,所以将后面的数标记为负号,即将减去一个数看作加上一个负数
}else if(s.charAt(i)=='-'){
res+=sign*num;
num=0;
sign=-1;
//如果是左括号,将上一次的答案数值res存入栈中,将后面的数的符号也存入栈中
//由于要求另一对括号内的数值,所以将res清零,sign=1
}else if(s.charAt(i)=='('){
stack1.push(res);
stack1.push(sign);
res=0;
sign=1;
//如果遇到右括号,则将右括号前的那个数先累加到res中
//再将num=0, 便于求后面的数
//在确定这对括号内求出的值的正负
//再将之前的值累加上去
}else if(s.charAt(i)==')'){
res+=sign*num;
num=0;
res*=stack1.pop();
res+=stack1.pop();
}
}
//例如:3+(1+2)-8
//可见最后的数-8之前还没有累加上去过,所以累加上去
if(num!=0){
res+=sign*num;
}
return res;
}
}