• Leetcode第150题—逆波兰表达式


    本次写的题目是逆波兰表达式,为LeetCode里面的题目,让我们来康康是如何解出这道题目的吧,各位尚没有思路的小伙伴可以跟随着博主的解题思路一步步来,感受一下😎

    🌱分析阶段

     在正式解这道题目之前,我们要先将学习一个技巧👉:中缀表达式转为后缀表达式

    🍃中缀表达式转为后缀表达式

    在计算机中,将中缀表达式转为后缀表达式,可以让计算机的计算更加快速,而我们将中缀表达式转为后缀表达式的方法就是——加括号,之后再将符号提取出来

    具体做法如下👇:

    先将中缀表达式按照运算顺序加上括号,之后按照优先,将符号提出当前括号外 

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    由此,我们可以得出一个结论:在后缀表达式中当碰到运算符号后,前面运算出来的或者本身有的数字,分别排在符号的左右两遍

    以LeetCode中的例子一来举例:

    要完成读取字符串,读到运算符号后将前两个读到的数字分别放在符号两边,之后再重复该过程。我们需要用到栈,来将数据放入,其操作是:一直读取数据直到读到符号,也就是一直放数据进入,到读到符号的时候再把之前的数据给弹出,先弹出的元素放在符号的右边,后弹出的在左边之后再将运算好的数据给放进去,等到看到符号再次弹出,一直重复过程直至整条后缀表达式已经算好。图解如下👇:

    以上分析阶段就结束了,下面进入到代码阶段~


    🌱代码阶段

    按照之前的分析,我们需要在这里去设置一个Integer类型栈,但是在题目中给的是String类型的数组,为什么我们要使用的类型是Integer类型的栈来收纳呢?原因是我们在接收到字符串的数字的时候,需要继续加减乘除这样的计算操作,然后字符串又相当于int类型,所以可以被接收。

    在我们看到题目中有+-*/的时候,会自动想到要分类讨论,这时候就可以用到switch语句,来自动进行分配,然后如果在检测到是数字而不是字符的时候,可以将数字字符转换为int类型后再放入栈,以保证能放入真正的数字。

    🍃检测符号函数

    为了让代码整体显得更加整洁,我们可以将检测当前符号是不是+ - * / 作为一个函数,命名为isOperation。具体代码实现如下👇:

    1. import java.util.*;
    2. class Solution {
    3. public int evalRPN(String[] tokens) {
    4. }
    5. public boolean isOperation(String str){
    6. if(str.equals("+")||str.equals("-")||str.equals("*")||str.equals("/")){
    7. return true;
    8. }else{
    9. return false;
    10. }
    11. }
    12. }

    🍃整体实现部分

    如之前分析的一样,我们可以先创建一个放入Integer类型的栈,然后将整个String数组遍历一遍,每遍历一次就判定是数字还是符号,如果是数字就将String类型转换为int类型后再放入栈(在这里我们需要用到Integer.parseInt类型),如果是符号就弹出栈里面的两个元素,然后依据switch语句判断是哪个符号,之后进行+ - * / 的一系列操作。具体代码如下👇:

    1. import java.util.*;
    2. class Solution {
    3. public int evalRPN(String[] tokens) {
    4. Stack stack = new Stack<>();
    5. for(int i = 0;i
    6. String str = tokens[i];
    7. if(!isOperation(str)){ //判断是不是数字,不是数字就执行else语句里面的操作
    8. stack.push(Integer.parseInt(tokens[i]));
    9. }else{
    10. //依照之前的分析,在这里我们需要将先弹出的元素用名字为right的int类型数据接收
    11. //而后弹出的要用名字为left的int类型数据接收
    12. int right = stack.pop();
    13. int left = stack.pop();
    14. switch(str){
    15. case "+":
    16. stack.push(left+right);
    17. break;
    18. case "-":
    19. stack.push(left-right);
    20. break;
    21. case "*":
    22. stack.push(left*right);
    23. break;
    24. case "/":
    25. stack.push(left/right);
    26. break;
    27. }
    28. }
    29. }
    30. return stack.pop();
    31. }
    32. }

    结合起来的完整代码如下👇:

    1. import java.util.*;
    2. class Solution {
    3. public int evalRPN(String[] tokens) {
    4. Stack stack = new Stack<>();
    5. for(int i = 0;i
    6. String str = tokens[i];
    7. if(!isOperation(str)){ //判断是不是数字,不是数字就执行else语句里面的操作
    8. stack.push(Integer.parseInt(tokens[i]));
    9. }else{
    10. //依照之前的分析,在这里我们需要将先弹出的元素用名字为right的int类型数据接收
    11. //而后弹出的要用名字为left的int类型数据接收
    12. int right = stack.pop();
    13. int left = stack.pop();
    14. switch(str){
    15. case "+":
    16. stack.push(left+right);
    17. break;
    18. case "-":
    19. stack.push(left-right);
    20. break;
    21. case "*":
    22. stack.push(left*right);
    23. break;
    24. case "/":
    25. stack.push(left/right);
    26. break;
    27. }
    28. }
    29. }
    30. return stack.pop();
    31. }
    32. public boolean isOperation(String str){
    33. if(str.equals("+")||str.equals("-")||str.equals("*")||str.equals("/")){
    34. return true;
    35. }else{
    36. return false;
    37. }
    38. }
    39. }

    以上,就是全部代码了!😎来测试一下吧~

    nice😎✨

  • 相关阅读:
    python笔记(15)函数
    Java学习笔记(二十二)
    搭载AI之后的表格插件又有哪些新的改变
    MySQL数据表内容查询(一)
    机器学习作业3____决策树(CART算法)
    十四、商城 - 商城架构-SSM(2)
    java计算机毕业设计科研团队管理系统MyBatis+系统+LW文档+源码+调试部署
    【Python_Process_Thread】Processing_Threading
    轻量级简约仪表板Dasherr
    【centos7】centos7卸载gitlab
  • 原文地址:https://blog.csdn.net/Green_756/article/details/126389232