Python利用栈实现中序表达式转换后序表达式

"""
中序表达式转为后序表达式:(假设中序表达式是一个以空格分隔的标记字符串)
    ①创建用于保存运算符的空栈opstack,以及一个用于保存结果的空列表
    ②使用字符串split方法将输入的中序表达式转换成一个列表
    ③从左到右扫描这个标记列表
        如果标记是操作数,将其添加到结果列表的末尾;
        如果标记是左括号,将其压入栈中;
        如果标记是右括号,反复从opstack中弹出元素,直到弹出对应的左括号。将栈中取出的么一个运算符都添加到结果列表的末尾;
        如果标记是运算符,将其压入opstack中,但是在此之前先从栈中取出优先级更高或者相同的运算符,并将它们添加到结果列表的末尾;
    ④处理完表达式之后,检查opstack。将其中若剩下的运算符全部添加到结果列表的末尾,最后调用join方法连接形成后序表达式
"""
from Algorithm import Stack_1
import string

def infixToPostfix(infixexpr):
    # 定义字典,将运算符优先级转化为数字,数字越大优先级越大
    prec = { }
    prec["*"] = 3
    prec["/"] = 3
    prec["+"] = 2
    prec["-"] = 2
    prec["("] = 1

    # 实例化一个空栈,以及一个空列表存放临时结果
    opstack = Stack_1.Stack()
    postfixList = []

    # 字符串方法,将前序表达式转换为列表
    tokenList = infixexpr.split()

    #遍历前序表达式列表
    for token in tokenList:
        #如果标记是操作数,将其添加到结果列表的末尾;
        if token in string.ascii_uppercase:
            postfixList.append(token)
        #如果标记是左括号,将其压入栈中;
        elif token == "(":
            opstack.push(token)
         #如果标记是右括号,反复从opstack中弹出元素,直到弹出对应的左括号。将栈中取出的么一个运算符都添加到结果列表的末尾;
        elif token ==")":
            topToken = opstack.pop()
            while topToken !="(":
                postfixList.append(topToken)
                topToken = opstack.pop()
        else:
            #如果标记是运算符,将其压入opstack中,但是在此之前先从栈中取出优先级更高或者相同的运算符,并将它们添加到结果列表的末尾;
            while (not opstack.isEmpty()) and (prec[opstack.peek()]>=prec[token]):
                postfixList.append(opstack.pop())
            opstack.push(token)

     #遍历结束后,处理完表达式之后,检查opstack。将其中若剩下的运算符全部添加到结果列表的末尾
    while not opstack.isEmpty():
        postfixList.append(opstack.pop())

    return " ".join(postfixList)

if __name__ == "__main__":
    print(infixToPostfix("( A + B ) * ( C + D )"))

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值