栈(计算表达式)

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;
    }
}