逆波兰表达式求值,中缀转后缀

本文介绍了逆波兰表达式的计算原理,无需括号和运算符优先级,通过栈操作实现。作者给出了一个Java代码示例,演示了如何使用栈来计算中缀表达式转换后的后缀表达式。
摘要由CSDN通过智能技术生成

什么是逆波兰表达式?

答:逆波兰表达式的计算不需要括号和依赖于运算符的优先级法则,只需要依据从左到右扫描表达式并遵循“遇到数字则压栈,遇到运算符则弹出栈顶所需数量的操作数进行运算,然后将结果压回栈中”的原则。

那我们先来看一个例子把!

中缀表达式 : 2+(3*5)

后缀表达式 : 235*+

看到这里想必很多小伙伴都蒙了吧,那就让我们继续往下看吧

让我们来解释一下每一步吧,首先这个遵循从左往右,先乘除后加减的原则,因为 * 的两边已经有括号了,所以不需要加括号,然后从左往右,遇到第一个运算符 “+”  ,把 + 左右两边的表达式或数值用括号括起来,然后把对应的运算符挪到本括号的外边(注意是右边),最后把所有的括号删除即可

很好,你已经学会了前缀转后缀了

那究竟为什么可以这样算呢?那这样算的结果和最初的结果一样吗?让我们来一探究竟吧!

首先我们先申请一个栈,我们知道栈是遵循先进后出的原则,我们从最左边开始往后找

  1. 如果碰到了数值,那么把它放入栈中
  2. 如果碰到了运算符,那么把运算符单独拿出来,接着把 运算符单独拿出来
  3. 把运算符拿出来之后继续从栈中依次取出两个元素,最上面的元素放到运算符的右边,倒数第二个放到运算符的左边,注意,这里顺序不能乱,把运算之后的结果再一次放入栈中,然后重复,直到算出结果

很好,你已经学会如何运算了,那么我们来尝试一道练习题吧!

我们按照对应的位置分别进行从1~7的赋值

即a = 1 , b = 2 , c = 3 , d = 4 , e = 5 , f = 6 , g = 7

1 + 2 * 3 +(4 * 5 + 6) * 7 = 189
abc*+de*f+g*+ = ?

让我来解释一下吧!

  • 2*3的结果是6
  • 6+1的结果是7
  • 4*5的结果是20
  • 6+20的结果是26
  • 26*7的结果是182
  • 182+7的结果是189
  • 如果还有不懂的建议自己画图理解一下,非常的简单

下面是一个练习:

. - 力扣(LeetCode)

下面是我写的一个java代码,仅供参考

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for(int i = 0;i<tokens.length;i++){
            String tmp = tokens[i];
            if(!isOpearation(tmp)){
                Integer val = Integer.valueOf(tmp);
                stack.push(val);
            } else {
                Integer val2 = stack.pop();
                Integer val1 = stack.pop();
                switch(tmp){
                    case "+":
                        stack.push(val1+val2);
                    break;
                    case "-":
                        stack.push(val1-val2);
                    break;
                    case "*":
                        stack.push(val1*val2);
                    break;
                    case "/":
                        stack.push(val1/val2);
                    break;
                }
            }
        }
        return stack.pop();
    }
    public boolean isOpearation(String s){  
        if(s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")){
            return true;
        }
        return false;
    }
}

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值