表达式求值,借助两个栈可以实现,一个存数字,一个存字符,遇到字符,根据优先级进行出栈运算,没有写出来,当遇到()时,需要进行递归,将()中的表达式递归,然后就是遇到运算符,就正常运算就行,最后如果存数字的栈没空,就将里面的数字相加就可得到答案。

import java.util.*;

public class Solution {
/*
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
/
public int solve (String s) {
// write code here
if(s.length()==0)
return 0;
Stack<integer> s1=new Stack<>();
char []str=s.toCharArray();//转换为字符数组
int num=0;
char sign='+';//当前运算符,默认符号为加号
int res=0;//结果
for(int i=0;i<str.length;i++){
if(str[i]==' '){//空格跳过
continue;
}
if(str[i]>='0'&&str[i]<='9'){
num=num</integer>
10+str[i]-'0';//将字符转换为数字
}
if(str[i]=='('){
int j=i+1;
int count=1;//当前左括号数
while(count>0){
if(str[j]=='(')
count++;
if(str[j]==')')
count--;
j++;
}
num=solve(s.substring(i+1,j-1));//递归左括号到右括号中的数字运算
i=j-1;
}
if(str[i]<'0'||str[i]>'9'||i==str.length-1){
if(sign=='+')//加号存入数字
s1.push(num);
else if(sign=='-')//负号存入数字的相反数
s1.push(-1*num);
else if(sign=='
')//乘号与当前栈中第一个元素相乘,再存入
s1.push(s1.pop()*num);
num=0;
sign=str[i];
}
}
while(!s1.empty()){
res+=s1.pop();
}
return res;
}
}