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

京公网安备 11010502036488号