超链接👇
逆波兰表达式
这是一个逆波兰表达式(tokens)
如何把逆波兰表达式转换为中缀表达式:
每个运算符的前两个元素进行计算:左操作数±/右操作数,然后将其括起来,然后再往后找运算符,找到后,运算符的前两个元素进行计算。*
思路:创建一个栈,先把tokens字符串遍历,非运算符时将元素转换为整型后压栈,遇到运算符时,出栈2个元素,进行计算后放入栈中,然后接着遍历。
1.创建一个栈先遍历tokens字符串(foreach遍历 或者 别的遍历方法都可以)
Stack<Integer> stack = new Stack<>();
for(String x : tokens){
};
2.遇到非运算符时 将元素转换为整型后压栈
for(String x : tokens){
//不是运算符时 让元素压栈
if(!(x.equals("+")|| x.equals("-") || x.equals("*")|| x.equals("/"))){
stack.push(Integer.valueOf(x));
}
3.遇到运算符时 出栈两个元素分别为右操作数(第一个出栈)和左操作数(第二个出栈),进行计算后把结果入栈
Stack<Integer> stack = new Stack<>();
for(String x : tokens){
//不是运算符时 让元素压栈
if(!(x.equals("+")|| x.equals("-") || x.equals("*")|| x.equals("/"))){
stack.push(Integer.valueOf(x));
}else{//否则 出栈两个 进行运算
int right = stack.pop();//第一个出栈元素是右操作数
int left = stack.pop();//第二个出栈元素是左操作数
switch(x){//左操作数+-*/右操作数
case "+" :
stack.push(left + right);
break;
case "-" :
stack.push(left - right);
break;
case "*" :
stack.push(left * right);
break;
case "/" :
stack.push(left / right);
break;
}
}
}
完整代码👇
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for(String x : tokens){
//不是运算符时 让元素压栈
if(!(x.equals("+")|| x.equals("-") || x.equals("*")|| x.equals("/"))){
stack.push(Integer.valueOf(x));
}else{//否则 出栈两个 进行运算
int right = stack.pop();//第一个出栈元素是右操作数
int left = stack.pop();//第二个出栈元素是左操作数
switch(x){//左操作数+-*/右操作数
case "+" :
stack.push(left + right);
break;
case "-" :
stack.push(left - right);
break;
case "*" :
stack.push(left * right);
break;
case "/" :
stack.push(left / right);
break;
}
}
}
return stack.peek();//最后只有一个元素在栈中
}
}
运行结果👇