Leetcode第150题—逆波兰表达式

本次写的题目是逆波兰表达式,为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😎✨

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值