python实现中缀表达式到后缀表达式的转换

本文介绍了将中缀表达式转换为后缀表达式(逆波兰表示法)的算法实现过程,通过栈操作完成。在实际编程中遇到了问题,即程序始终返回中缀表达式。问题出在split()函数,默认按空格分隔,导致没有正确处理不含空格的输入。修复方法是在输入时确保包含空格。代码中展示了详细的转换步骤,包括运算符优先级判断和括号处理。最后,给出了调试后的正确代码。
摘要由CSDN通过智能技术生成

中缀表达式:(A+B)*(C+D)[人的逻辑]
后缀表达式:A B + C D + * [计算机的逻辑]
可以使用栈的方式实现转换。

程序写完后,发现无论输入什么,输出都是中缀表达式。
后来调试发现是程序中的split()函数的原因。

str.split(str="", num=string.count(str)).
·str:分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
·num:分割次数。

默认为空格进行分隔,所以在输入时要注意加上空格,如:
加上空格:( A + B ) * ( C + D )
没加空格:(A+B)*(C+D)

代码如下:

'''
1.创建空栈,以及一个用于保存结果的列表
2.使用split()将输入的表达式分为多个元素
3.从左向右扫描表达式:
    (1)如果是字母,添加到结果列表
    (2)如果是左括号,左括号进栈
    (3)如果是右括号,循环出栈,遇到左括号停止。栈中的运算符添加到结果列表
    (4)如果是运算符,进栈,但在进栈之前,若栈顶运算符优先级 >= 当前运算符,
        栈顶运算符出栈,并添加到结果列表,当前运算符进栈
4.检查栈,将剩余的运算符添加至结果列表

'''

from pythonds.basic import Stack
import string          
            
def operation(maths):
    
    signgrade = {'*':3,'/':3,'+':2,'-':2,'(':1} #运算符优先级
    s = Stack()             #空栈
    maths = maths.split()   #拆分符号,split()默认为空格拆分
    signlist = []           #保存结果的列表
    
    for math in maths:
        if math in string.ascii_uppercase:
            signlist.append(math)
        
        elif math == '(':  #如果是左括号,进栈
            s.push(math)
            
        elif math == ')':        #如果是右括号,
            Math = s.pop()       #从栈中移除元素,
            while Math != '(':   #遇到左括号停止
                signlist.append(Math)   #将移除的元素添加到列表
                Math = s.pop()
                
        else: 
            while (not s.isEmpty()) and \
                (signgrade[s.peek()] >= signgrade[math]): #若栈顶优先级>=当前运算符优先级
                signlist.append(s.pop())                  #栈顶出栈加入列表
            s.push(math)                                  #当前运算符进栈
            
    while not s.isEmpty():            #检查栈,将所有剩余的运算符添加至结果列表
        signlist.append(s.pop())
    return ','.join(signlist)         #','.join()将序列中的元素以指定的字符连接生成一个新的字符串。

如有问题,请大家改正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值