本次写的题目是逆波兰表达式,为LeetCode里面的题目,让我们来康康是如何解出这道题目的吧,各位尚没有思路的小伙伴可以跟随着博主的解题思路一步步来,感受一下😎
🌱分析阶段
在正式解这道题目之前,我们要先将学习一个技巧👉:中缀表达式转为后缀表达式
🍃中缀表达式转为后缀表达式
在计算机中,将中缀表达式转为后缀表达式,可以让计算机的计算更加快速,而我们将中缀表达式转为后缀表达式的方法就是——加括号,之后再将符号提取出来
具体做法如下👇:
先将中缀表达式按照运算顺序加上括号,之后按照优先,将符号提出当前括号外
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
由此,我们可以得出一个结论:在后缀表达式中当碰到运算符号后,前面运算出来的或者本身有的数字,分别排在符号的左右两遍
以LeetCode中的例子一来举例:
要完成读取字符串,读到运算符号后将前两个读到的数字分别放在符号两边,之后再重复该过程。我们需要用到栈,来将数据放入,其操作是:一直读取数据直到读到符号,也就是一直放数据进入,到读到符号的时候再把之前的数据给弹出,先弹出的元素放在符号的右边,后弹出的在左边之后再将运算好的数据给放进去,等到看到符号再次弹出,一直重复过程直至整条后缀表达式已经算好。图解如下👇:
以上分析阶段就结束了,下面进入到代码阶段~
🌱代码阶段
按照之前的分析,我们需要在这里去设置一个Integer类型栈,但是在题目中给的是String类型的数组,为什么我们要使用的类型是Integer类型的栈来收纳呢?原因是我们在接收到字符串的数字的时候,需要继续加减乘除这样的计算操作,然后字符串又相当于int类型,所以可以被接收。
在我们看到题目中有+-*/的时候,会自动想到要分类讨论,这时候就可以用到switch语句,来自动进行分配,然后如果在检测到是数字而不是字符的时候,可以将数字字符转换为int类型后再放入栈,以保证能放入真正的数字。
🍃检测符号函数
为了让代码整体显得更加整洁,我们可以将检测当前符号是不是+ - * / 作为一个函数,命名为isOperation。具体代码实现如下👇:
import java.util.*;
class Solution {
public int evalRPN(String[] tokens) {
}
public boolean isOperation(String str){
if(str.equals("+")||str.equals("-")||str.equals("*")||str.equals("/")){
return true;
}else{
return false;
}
}
}
🍃整体实现部分
如之前分析的一样,我们可以先创建一个放入Integer类型的栈,然后将整个String数组遍历一遍,每遍历一次就判定是数字还是符号,如果是数字就将String类型转换为int类型后再放入栈(在这里我们需要用到Integer.parseInt类型),如果是符号就弹出栈里面的两个元素,然后依据switch语句判断是哪个符号,之后进行+ - * / 的一系列操作。具体代码如下👇:
import java.util.*;
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for(int i = 0;i<tokens.length;i++){
String str = tokens[i];
if(!isOperation(str)){ //判断是不是数字,不是数字就执行else语句里面的操作
stack.push(Integer.parseInt(tokens[i]));
}else{
//依照之前的分析,在这里我们需要将先弹出的元素用名字为right的int类型数据接收
//而后弹出的要用名字为left的int类型数据接收
int right = stack.pop();
int left = stack.pop();
switch(str){
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.pop();
}
}
结合起来的完整代码如下👇:
import java.util.*;
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for(int i = 0;i<tokens.length;i++){
String str = tokens[i];
if(!isOperation(str)){ //判断是不是数字,不是数字就执行else语句里面的操作
stack.push(Integer.parseInt(tokens[i]));
}else{
//依照之前的分析,在这里我们需要将先弹出的元素用名字为right的int类型数据接收
//而后弹出的要用名字为left的int类型数据接收
int right = stack.pop();
int left = stack.pop();
switch(str){
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.pop();
}
public boolean isOperation(String str){
if(str.equals("+")||str.equals("-")||str.equals("*")||str.equals("/")){
return true;
}else{
return false;
}
}
}
以上,就是全部代码了!😎来测试一下吧~
nice😎✨