先将String转换成逆波兰表达式:
import java.util.*;

public class Solution {
/*
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
public int solve (String s) {
// write code here
String sh = reverse(s);
int k =caluReverse(sh);
return k;
}
public String reverse(String s){
//新建一个String变量用来存放逆波兰表达式
String ns = "";
Deque<character> stack = new LinkedList<character>();
//遍历传入参数里面的值
for(int i =0;i<s.length();i++){
//先判断它是不是数字如果是数字的话,连它后面是不是数字也要判断,防止出现多位数
while(i<s.length()&&Character.isDigit(s.charAt(i))){
String nb = String.valueOf(s.charAt(i++));
ns += nb;
}
//整体数字不用空格隔开,例如79是一个整体数7 9 就是 两个数
ns+=" ";
//逆波兰表达式中'(' 优先级最低直接压入
if(i<s.length()&& s.charAt(i) == '('){
stack.push(s.charAt(i));
}
// 碰到')',得把栈里面所有得操作符吐出来,合并到逆波兰表达式,然后再把栈里面得'('吐出来
else if(i<s.length()&&s.charAt(i) == ')'){
while(stack.peek() != '('){
char nh = stack.pop();
String nnh = String.valueOf(nh);
ns += nh;
ns+=" ";
}
stack.pop();
}
//碰到加减得话得看栈里面还剩什么,如果不为空得话先要把栈顶'+' '-' '</character></character>
'吐出来,如果遇到'('直接压栈
else if(i<s.length()&&(s.charAt(i)=='+' || s.charAt(i) == '-')){
if(!stack.isEmpty() && stack.peek()!= '('){
char nb = stack.pop();
String nnb = String.valueOf(nb);
ns += nb;
ns+=" ";
}
stack.push(s.charAt(i));
}
//''判断栈顶是不是优先级和他一样,如果一样栈里面吐操作符,不一样就是优先级比他低,直接压
else if(i<s.length()&& s.charAt(i) == '
') {
if(!stack.isEmpty() && stack.peek()==''){
char nb = stack.pop();
String nnb = String.valueOf(nb);ns += nb;
ns+=" ";
}
stack.push(s.charAt(i));
}
}
//最后依次吐栈里面得操作符
while(!stack.isEmpty()){
char lastSign = stack.pop();
String nb = String.valueOf(lastSign);
ns += nb;
ns+=" ";
}
return ns;
}
//计算逆波兰表达式,利用栈
public int caluReverse(String s){
Deque<integer> stack = new LinkedList<>();
int sum = 0;
for(int i =0;i<s.length();i++) {
if (i < s.length() && Character.isDigit(s.charAt(i))) {
int nu = 0;
while (i < s.length() && Character.isDigit(s.charAt(i))) {
nu = nu*10 + s.charAt(i++)-'0';
}
stack.push(nu);
}
else{
switch (s.charAt(i)){
case '+':
int o = stack.pop();
int j = stack.pop();
stack.push(o+j);
break;
case '-':
int k = stack.pop();
int l = stack.pop();
stack.push(l-k);
break;
case '</integer>
':
int m = stack.pop();
int n = stack.pop();
stack.push(n*m);
break;
}
}
}
sum = stack.pop();
return sum;
}
}