python数据结构 栈的实例 表达式转换 中缀转前缀后缀

Posted allmenmustdie123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python数据结构 栈的实例 表达式转换 中缀转前缀后缀相关的知识,希望对你有一定的参考价值。

# 栈的应用 表达式转换 中缀转前缀(包括字符:26个大写字母、10个数字、(、)、+、-、*、/)
from pythonds.basic.stack import Stack
def infixToPrefix(infix):
    prec = {}                                                #设置操作符优先级字典
    prec[\'*\'] = 3
    prec[\'/\'] = 3
    prec[\'+\'] = 2
    prec[\'-\'] = 2
    prec[\')\'] = 1
    opStack = Stack()                                        #实例化栈类
    prefixList = []                                            #用于保存转换完成后的字符列表
    tokenList = infix[::-1].split()                            #以空格分割待转换的反转字符串
    for token in tokenList:
        if token in \'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\':    #如果为字母或数字,则
            prefixList.append(token)                        #添加到最终列表
        elif token == \')\':
            opStack.push(token)                                #将")"入栈
        elif token == \'(\':
            topToken = opStack.pop()                        #出栈
            while topToken != \')\':                            #若该出栈元素为运算符,则
                prefixList.append(topToken)                    #因该运算符位于()中,具有更高的优先级,则将运算符添加到最终列表
                topToken = opStack.pop()                    #继续出栈,直到为与"("对应的")"
        else:
            #若栈不为空,且栈顶元素的优先级>=运算符的优先级(表明栈顶元素也是运算符,这2个运算符相邻)
            while (not opStack.isEmpty()) and (prec[opStack.peek()] >= prec[token]):
                prefixList.append(opStack.pop())            #将栈顶元素(比当前运算符具有更高优先级)添加到最终列表
            opStack.push(token)                                #该运算符入栈
    while not opStack.isEmpty():                            #对比完后,栈仍不为空,则
        prefixList.append(opStack.pop())                    #将栈内剩余元素添加到最终列表
    return " ".join(prefixList)                                #将最终列表组合成最终字符串


print(infixToPrefix("( A + B ) * ( C + D ) * ( E + F )") )

运行结果

# 栈的应用 表达式转换 中缀转后缀(包括字符:26个大写字母、10个数字、(、)、+、-、*、/)
from pythonds.basic.stack import Stack
def infixToPostfix(infix):
    prec = {}                                        #设置操作符优先级字典
    prec["*"] = 3
    prec["/"] = 3
    prec["+"] = 2
    prec["-"] = 2
    prec["("] = 1
    opStack = Stack()                                 #实例化栈类
    postfixList = []                                 #用于保存转换完成后的字符列表
    tokenList = infix.split()                        #以空格分割待转换字符串
    for token in tokenList:
        if token in "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789":    #如果为字母或数字,则
            postfixList.append(token)                        #添加到最终列表
        elif token == \'(\':                                     
            opStack.push(token)                                #将"("入栈
        elif token == \')\':
            topToken = opStack.pop()                        #出栈
            while topToken != \'(\':                             #若该出栈元素为运算符,则
                postfixList.append(topToken)                 #因该运算符位于()中,具有更高的优先级,则将运算符添加到最终列表
                topToken = opStack.pop()                     #继续出栈,直到为与")"对应的"("
        else:                                                 #如果为运算符,则
            #若栈不为空,且栈顶元素的优先级>=运算符的优先级(表明栈顶元素也是运算符,这2个运算符相邻)
            while (not opStack.isEmpty()) and (prec[opStack.peek()] >= prec[token]):
                postfixList.append(opStack.pop())            #将栈顶元素(比当前运算符具有更高优先级)添加到最终列表
            opStack.push(token)                                #该运算符入栈
    while not opStack.isEmpty():                            #对比完后,栈仍不为空,则
        postfixList.append(opStack.pop())                    #将栈内剩余元素添加到最终列表
    return " ".join(postfixList)                            #将最终列表组合成最终字符串

print(infixToPostfix(\'( A + B ) * ( C + D ) * ( E + F )\'))

运行结果

以上是关于python数据结构 栈的实例 表达式转换 中缀转前缀后缀的主要内容,如果未能解决你的问题,请参考以下文章

中缀表达式转换成后缀表达式并求值

数据结构——第三章 栈

数据结构——前中后缀表达式的转换(栈的应用)

表达式树—中缀表达式转换成后缀表达式

22栈的应用-中缀表达式转后缀表达式

栈的应用-简单计算器(中缀表达式转后缀表达式)