栈的初理解2

中缀表达式后缀表达式

在介绍两道OJ题之前我们先了解中缀表达式后缀表达式

中缀表达式:中缀表达式就是人们常用的算数表示方法,例如(5+4)*3-2

后缀表达式:后缀表达式,又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则)。根据上面的中缀表达式我们可以得到他的逆波兰式:54+3*2-

如何一步步的将中缀表达式转换成逆波兰表达式呢?我将介绍一种简单的方法(括号法)(ps:自己命名的)告诉大家

1.将每个运算符后加一个括号

我们可以看到4前面的 + 已经有括号了,二3前面的 * 并没有括号,接下来就是在3处加上一个括号,如上图所示

2.

3.将每个运算符移出当前的括号

 

4.去除括号

 到了第四步我们就完成了我们的后缀表达式,也就是逆波兰式!!!


 当我们拿到一个逆波兰式的时候如何计算这个值呢?这个时候我们便需要借助我们所学到的栈

如何用栈计算逆波兰式?

通过上述图所知,可以定义一个变量i,通过这个变量i来遍历整个后缀表达式,当i走到数字时,将数字入栈,并i++,那么走到字符时候该怎么办呢?

 

 上述图可知,当走到字符串的时候就该进行加减乘除计算了,但是这时就遇到一个严重的问题,出栈的数字是放在运算符的左边还是右边,对于加法和乘法而言,出栈的数字放在左右都无所谓,而对于除法和减法,数字的左右便有了很大的区别!!!这里不用担心,只要记住出先出栈的数字放在右边,后出栈的数字放在左边!!!

最终计算的结果27!!!


接下来便是通过OJ来更加深刻的理解栈!!! 

 

class Solution {
    Stack<Integer> stack = new Stack<>();//创建一个栈
    public int evalRPN(String[] tokens) {
        for(int i = 0;i < tokens.length;i++){
            String val = tokens[i];//将字符存入栈,此时要创建一个栈
            if(!isOperation(val)){
                //进入这里说明不是运算符
                stack.push(Integer.parseInt(val));//val是字符类型要转换成整数
            }else{
                int num2 = stack.pop();
                int num1 = stack.pop();
                //判断运算符
                switch(val){
                    case "+":
                    stack.push(num1 + num2);
                    break;
                    case "-":
                    stack.push(num1 - num2);
                    break;
                    case "*":
                    stack.push(num1 * num2);
                    break;
                    case "/":
                    stack.push(num1 / num2);
                    break;
                }
            }
        }
        return stack.pop();
    }
    public boolean isOperation(String x){
        //判断遍历的是字符串还是数字
        //通过equals方法来判断
        if(x.equals("+") || x.equals("-") || x.equals("*") || x.equals("/") ){
            return true;
        }
        return false;
    }
}

OJ链接:力扣 

具体的文字我也就不详细写了,代码中都有思路体现,博主作为刚入坑的小白,也希望看到文章的大佬指点指点。

上面这道OJ题也是体现了栈的实际应用,做到这里对栈的理解也是更加的深刻,当然还有一道oj也会在下篇博客中给大家呈现!!!

感谢支持!!!

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w-ib

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值