中缀表达式转换为前缀和后缀形式

本文介绍了如何将中缀表达式转换为前缀和后缀形式,重点讨论了无括号和有括号情况下的转换规则。通过分析运算符优先级,提出使用两个栈,一个存放操作符,一个存放数字。对于无括号表达式,展示了从同一运算优先级到不同运算优先级的转换过程。同时,详细说明了括号如何影响运算符的优先级,并给出代码实现的简单栈定义、后缀及前后缀表达式转换的方法。
摘要由CSDN通过智能技术生成

中缀表达式转换为前缀形式

  • 为方便观察,数字以ABCD命名。
  • 运算符只有加减乘除。
  • 运算符之前的两位数字是中缀表达式中运算符连接的两位数字。如果运算符是连续的,那么右边的运算符先于左边的运算符进行计算
  • 实际上,括号打破了“加减乘除”运算的优先级规律,所以应当先思考无括号的情况,后思考有括号的情况。
  • 假设有两个栈,栈op存放操作符,栈num存放数字。

只考虑无括号

同一运算优先级

设eq=A + B + C + D
已知转换结果为+ + + A B C D
分析可知,按照中缀表达式的思路,先进行了 A + B ,后进行了 ( A + B ) +C,最后进行了 ( ( A + B ) +C ) + D。
那么

次数 op num
1 PUSH D
2 PSUH +
3 PUSH C
4 PSUH +
5 PUSH B
6 PSUH +
7 PSUH A

最终

op num
A
+ B
+ C
+ D

可以发现,将op逐一取出并放在num的栈顶,最后的结果是符合中缀表达式的思路的。

不同运算优先级

设eq=A + B * C
已知转换结果为+ A * B C
如果按照之前的做法,那么
在这里插入图片描述
即( A + B ) * C
*的优先级被忽视

为了体现运算符的优先级,高运算符应当紧贴对应连接的数字
在这里插入图片描述

考虑有括号

括号的作用在于提高了括号内的运算符的优先级,也就是说从右向左遍历,当遇到右括号时,将其压入op栈,当遇到左括号时,需要逐次取出op栈的栈顶元素并将其压入num栈,直到取出右括号。
当然括号内的运算式也需要符合【不同运算优先级】的规律。

代码实现

简单定义栈

class Stack():
    def __init__(self):
        self.items=[]
    def push(self,item):
        self.items.append(item)
        return self.items
    def pop(self):
        return self.items.pop()
    def peek(self) :
        return self.items[-1]
    def isEmpty(self):
        return self.items==[]
    def size(self):
        return len( self.items 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值