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是不是数字形式的字符。