zoukankan      html  css  js  c++  java
  • 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 )'))

    运行结果

  • 相关阅读:
    (Oracle)取当前日期的最近工作日
    (Oracle)误删oracle表结构恢复
    (Oracle)DDL及其数据泵导入导出(impdp/expdp)
    kettle 连接oracle12c问题解决办法:
    js日历算法
    js设置cookies
    js获取下拉框的value值
    js记住密码
    checkBox的全选与全不选
    select下拉框选中其中一个值
  • 原文地址:https://www.cnblogs.com/liuchaodada/p/13209856.html
Copyright © 2011-2022 走看看