import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    public int solve (String s){
       Stack<Integer> stk=new Stack<>();   //初始化栈
       int res=0;  //存放结果
       int num=0;  //默认数字
       char sign='+'; //默认第一个运算符是+
       char[] arr=s.toCharArray();  //字符串转化为字符数组
       
       for(int i=0;i<s.length();i++){
          if(arr[i]=='('){
            int j=i+1;
            int counterPar=1;  //默认为一对括号,括号数
            while(counterPar>0){
                if(arr[j]=='('){  //如果有嵌套的小括号
                    counterPar++;
                }
                if(arr[j]==')'){
                    counterPar--;
                }

                j++;  //继续向后找
            }
              //遇到左括号递归求这个括号里面表达式的值
              //就是求左括号 到 右括号 之间 表达式的 值,返回值为 num,下面接着进栈
              num=solve(s.substring(i+1,j-1));
              i=j-1;
          }
          
          //判断是否为数字,是数字就求完整的数字的值,进入循环分支,直到出现运输符、
          //Character.isDigit( c ),其中c是字符,这个方法可以用于判断字符c是不是数字形式的字符。
          if(Character.isDigit(arr[i])){
               num=num*10+arr[i]-'0';    
          }

          //如果不是数字或者是最后一个字符进入这个分支
          if(!Character.isDigit(arr[i]) || i==s.length()-1){
            if(sign=='+'){
                stk.push(num);
            }else if(sign=='-'){
                stk.push(-1*num);  //注意负号
            }else if(sign=='*'){
                stk.push(stk.pop()*num); //弹出*的结果在压入栈中
            }else if(sign=='/'){
                stk.push(stk.pop()/num);
            }

            num=0; //结束后恢复默认值
            sign=arr[i];
          }
       }
    while(!stk.isEmpty()){//栈非空
        res+=stk.pop();
    }
     return res;//返回结果
    }
}

本题总结:

1、s.substring

substring() 方法用于提取字符串中介于两个指定下标 之间的字符

2、Character.isDigit()方法:

Character.isDigit( c ),其中c是字符,这个方法可以用于判断字符c是不是数字形式的字符。