前中后缀表达式互相转换,及实战例题


一、引子

首先我们来看一个式子:
(a+b)*c-d,这种常见的式子也就是我们的中缀表达式。
那什么是后缀表达式呢?后缀表达式又该如何转换?示例如下:

我们根据计算顺序,对上面的式子逐层加括号
在这里插入图片描述
然后把每层括号内的符号移动到对应层外:

在这里插入图片描述

最后把扩号去掉:

在这里插入图片描述
这样得到的式子ab+c*d-就是我们需要的后缀表达式
那么聪明如你,很快就会知道中缀表达式转前缀表达式的方法,对标转后缀,也就是把符号提到括号前面即可。

二、后缀表达式求值

我们仍以上面得到的后缀表达式ab+c* d-为例:
我们创建一个栈,和一个变量i:
在这里插入图片描述
用变量i去遍历后缀表达式ab+c*d-:
i对应的数据为操作数a,将a放入栈中,i++
在这里插入图片描述
在这里插入图片描述
继续用i遍历表达式:
i对应的数据为操作数b,将b放入栈中,i++
在这里插入图片描述
继续用i遍历表达式:
i对应的数据为操作符+,取栈顶元素放操作符右边,再取栈顶元素放操作符左边(这里左右顺序不可改,我们这里是加法好像没有区别,但如果是减法,a-b和b-a完全是两个概念)
在这里插入图片描述
得到a+b的值x后,把x放入栈中,i++
在这里插入图片描述
继续用i遍历表达式:
i对应的数据为操作数c,将c放入栈中,i++
在这里插入图片描述
继续用i遍历表达式:
i对应的数据为操作符 *,取栈顶元素放操作符右边,再取栈顶元素放操作符左边
在这里插入图片描述
得到x *c的值y后,将y放入栈中,i++:
在这里插入图片描述
继续用i遍历表达式:
i对应的数据为操作数d,将d放入栈中,i++
在这里插入图片描述
继续用i遍历表达式:
i对应的数据为操作符 -,取栈顶元素放操作符右边,再取栈顶元素放操作符左边
在这里插入图片描述
最后将z放入栈中,i继续往后走,发现没有可遍历的了,就把最终结果z拿出来即可。我们这里可以简单验证一下上面的方法对不对:
假定a,b,c,d值分别为1,2,3,4。用上面的方法求出的z是5
而正常的中缀表达式(a+b)*c-d也就是(1+2) * 3-4=5

三、力扣例题实战

在这里插入图片描述
在这里插入图片描述
代码示例如下:

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack=new Stack<>();

        for(int i=0;i<tokens.length;i++){
            String val=tokens[i];
            if(!isOperation(val)){
                //不是运算符(是运算数据)
                stack.push(Integer.parseInt(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();
    }
    private boolean isOperation(String x){
        if(x.equals("+")||x.equals("-")||x.equals("*")||x.equals("/")){
            return true;
        }else{
            return false;
        }
    }
}

在这里插入图片描述

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
下面是将中缀表达式转换为前缀表达式的代码: ```python def infix_to_prefix(expression): # 定义运算符的优先级 precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '^': 3} stack = [] prefix = [] for char in reversed(expression): if char.isalnum(): prefix.append(char) elif char == ')': stack.append(char) elif char == '(': while stack and stack[-1 != ')': prefix.append(stack.pop()) stack.pop() else: while stack and precedence[char < precedence.get(stack[-1], 0): prefix.append(stack.pop()) stack.append(char) while stack: prefix.append(stack.pop()) return ''.join(reversed(prefix)) expression = "(A*(B-C/D))*E" prefix_expression = infix_to_prefix(expression) print("前缀表达式:", prefix_expression) ``` 下面是将中缀表达式转换后缀表达式的代码: ```python def infix_to_postfix(expression): # 定义运算符的优先级 precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '^': 3} stack = [] postfix = [] for char in expression: if char.isalnum(): postfix.append(char) elif char == '(': stack.append(char) elif char == ')': while stack and stack[-1 != '(': postfix.append(stack.pop()) stack.pop() else: while stack and precedence[char <= precedence.get(stack[-1], 0): postfix.append(stack.pop()) stack.append(char) while stack: postfix.append(stack.pop()) return ''.join(postfix) expression = "(A*(B-C/D))*E" postfix_expression = infix_to_postfix(expression) print("后缀表达式:", postfix_expression) ``` 希望以上代码能够帮到你!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [中缀表达式,前缀表达式,后缀表达式之间的相互转换和代码表示](https://blog.csdn.net/FYSGXFZ/article/details/100620836)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [前缀、中缀和后缀表达式详解,中缀表达式到后缀表达式转换规则,以及后缀表达式的计算规则,附计算代码](https://blog.csdn.net/yldmkx/article/details/109537911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

劲夫学编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值