【栈的运用】表达式转化

本文介绍了如何将中缀表达式转化为后缀表达式,重点在于利用栈的后进先出特性。通过扫描中缀表达式,遇到运算符时根据优先级决定是否压栈或弹栈,遇到括号则进行特殊处理。最终,栈内的元素依次弹出构成后缀表达式。这种方法为计算机处理表达式计算提供了便利。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是后缀(前缀)表达式:我们所熟知的表达式,如1+1,1*5+1,2*3,(3+2)*8

这类的表达式其实都称为是中缀表达式,通过我们所约定俗成的规则——运算符优先级大的先算,来进行表达式的计算。然而计算机并不知道我们的这种规则,于是出现了后缀(前缀)表达式,如1+1转化为后缀表达式就是11+,(3+2)*8转化为后缀表达式就是32+8*。这种方法就有利于计算机的计算。

题目:将一个只含四则运算的中缀表达式转化为后缀表达式

如(1+1)*(9+9)等等

思路:不妨先写几个后缀表达式出来看看,题目中的案例转化为后缀就是11+99+*,1*1转化为11*,不难发现运算符都位于被运算字符的后面,并且优先级越低的运算符越后面,由此可以想到利用栈的后进先出来实现这个算法。

        扫描表达式,将运算字符放入答案列表中,遇到左括号时,压入栈,遇到右括号时,不断弹出栈内元素直到弹出左括号。遇到运算符时,先判断栈顶有无高优先级的运算符,有则弹出高优先级运算符,无则压入该运算符。最后扫描完,弹出栈内全部元素。

代码实现:

text = ['5','*','6','+','4']
answer = []
text_stock = []
for i in text:
    if i == '(' or i == '*' or i == '/': #(*/ 可以直接压入
        text_stock.append(i)
    elif i in '123456789':
        answer.append(i) #数字直接放到最后答案中
    elif i == ')':
        stockTOP1 = text_stock[-1]  #)需要匹配(,不断弹出栈顶元素直到匹配到元素
        while stockTOP1 != '(':
            answer.append(stockTOP1)
            text_stock.pop()
            stockTOP1 = text_stock[-1]
        text_stock.pop()
    else:  #最后判断+-号,栈顶没有*/则直接压入,有*/则弹出*/然后压入
        stockTOP2 = text_stock[-1]

        if stockTOP2 != '*' and stockTOP2 != '/':
            text_stock.append(i)

        else:

            answer.append(stockTOP2)
            text_stock.pop()
            text_stock.append(i)
for s in text_stock:  #最后遍历栈,弹栈输出答案
    answer.append(s)

print(''.join(answer))

总结:表达式转化与前面所说到的二进制转化与括号匹配在代码上难度更高,但是总体的思路不变,都是利用栈来做到次序转化这种次序转化就是先输入的东西不一定先输出,而是判断后再输出,造成的先入后出的现象,就叫做次序转化

二进制转化与括号匹配可以看我上一篇《数据结构之栈》【从零开始学算法】数据结构之栈__焱_的博客-优快云博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值