import java.util.*;
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ public int solve (String s) { // write code here //初始化栈 Stack stack = new Stack<>(); //结果 int sum = 0; //默认数字,运算符 int number = 0; //默认的第一个数字前的运算符为 + char sign = '+';
//字符串转化字符数组
char[] arr = s.toCharArray();
int n = s.length();
//对字符数组每个元素遍历
for(int i = 0;i<n;i++){
char c = arr[i];
//是否为左括号
if(c == '('){
int j = i + 1;
//默认是1对括号
int counterPar = 1;
while(counterPar > 0){
//统计是否存在括号嵌套的情况
if(arr[j] == '('){
counterPar++;
}
if(arr[j] == ')'){
counterPar--;
}
//向后直到找到右括号
j++;
}
//遇到左括号递归求这个括号里面表达式的值
//就是求左括号 到 右括号 之间 表达式的 值,返回值为 number,下面接着进栈
number = solve(s.substring(i + 1,j - 1));
//下一次就要从 j 开始,因为后面还有一个 i ++;
i = j - 1;
}
//是否为数字,是数字就求完整的数字值,每次循环都进这个分支,直到出现运算符
if(Character.isDigit(c)){
number = number * 10 + c - '0';
}
//不是数字 或者 为最后一个字符
if( ! Character.isDigit(c) || i == n - 1){
if(sign == '+'){
//是 + 先把 数字 压栈,等会全部数字出栈之和即为所求
stack.push(number);
}
else if(sign == '-'){
//是 - 压栈该数字的相反数
stack.push( -1 * number);
}
else if(sign == '*'){
//是 * ,弹栈算出结果,在压栈
stack.push(stack.pop() * number);
}
else if(sign == '/'){
//是 / ,弹栈算出结果,在压栈
stack.push(stack.pop() / number);
}
//每次结束,数字恢复默认值
number = 0;
// 遇到运算符时或者到表达式末尾时,就去计算上一个运算符并把计算结果push进栈,然后保存新的运算符
//运算符为 当前压栈数字 前面近邻的那个
sign = c;
//如果是负数 在 表达式的最前面 ,会先压栈 +0,然后在记录当前 负号,开始接下来的数字
}
}
while(!stack.isEmpty()){
sum += stack.pop();
}
return sum;
}
}