简体   繁体   English

如何使用堆栈将Infix转换为Postfix

[英]How to convert Infix to Postfix using Stack

Here is my code for converting infix to postfix using a previous stack code. 这是我的代码,用于使用先前的堆栈代码将中缀转换为后缀。 The stack code is functional but I don't understand what is wrong with my postix converter code. 堆栈代码可以正常工作,但我不理解postix转换器代码出了什么问题。 It is returning "RecursionError: maximum recursion depth exceeded". 它返回“ RecursionError:超过最大递归深度”。 But I don't think that is the problem. 但是我不认为这是问题所在。 I think it might be the PrecedenceCheck function 我认为可能是PrecedenceCheck函数

def postfix(expr):
    if len(expr)<=0 or not isinstance(expr,str): 
        print("expr error: postfix")
        return "error"
    expr=expr.strip()
    items=Stack()
    outputVariable = ""
    pos=0

    for i in range(len(expr)):
        if expr[i] in '+-*/^()':  
            items.push(expr[pos:i].strip())  
            items.push(expr[i])    # operator
            pos=i+1  
            items.push(expr[pos:].strip())

        elif expr[i] is '1234567890':
            outputVariable += i
        elif expr[i] is '(':
            items.push(expr[i])
        elif expr[i] is ')':
            while True:
                temp = items.pop()
                if temp is None or temp == '(':
                    break
                else:
                    outputVariable += temp

        elif expr[i] in '+-*/^' and (items is False or items.peek() is '('):
            items.push(expr[i])
        elif PrecedenceCheck(expr[i]) is True:
            items.push(expr[i])

        elif expr[i] in '+-*/^' and PrecedenceCheck(expr[i]) is False:
        while True:
            items.pop()
            if items.isEmpty() is True:
                items.push(expr[i])
                break
    return outputVariable

precedence = {}
precedence['*'] = 3
precedence['/'] = 3
precedence['+'] = 2
precedence['-'] = 2
precedence['('] = 1
precedence['^'] = 1

def PrecedenceCheck(char):
    items=Stack()
    outputVariable= " "
    if char in '1234567890':
        return False
    elif PrecedenceCheck(char) is True:
        while precedence[char] < precedence[items.peek()]:
            x = items.pop()
            x += outputVariable
            items.push(char)
        return outputVariable
     else:
         return 'error message'

Input: ('1 ^ 2') Expected output: '1.0 2.0 ^' Actual Output: RecursionError: maximum recursion depth exceeded 输入:('1 ^ 2')预期输出:'1.0 2.0 ^'实际输出:RecursionError:超过最大递归深度

if PrecedenceCheck(char) is True: occurs several times, yet PrecedenceCheck can return False or a string, neither of which will be True. if PrecedenceCheck(char) is True:发生多次,但是PrecedenceCheck可以返回False或字符串,而这两者都不是True。 Probably better to clean up PrecedenceCheck to always return a bool, or at least change your conditionals to if PrecedenceCheck(char): and cross your fingers that it never returns '' . 清理PrecedenceCheck最好总是返回一个布尔值,或者至少将条件更改为if PrecedenceCheck(char):并且用手指指它永远不会返回''

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM