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

时间:2019-07-22 20:24:21

标签: python postfix-mta infix-notation

这是我的代码,用于使用先前的堆栈代码将中缀转换为后缀。堆栈代码可以正常工作,但我不理解postix转换器代码出了什么问题。它返回“ RecursionError:超过最大递归深度”。但是我不认为这是问题所在。我认为这可能是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'

输入:('1 ^ 2') 预期输出:'1.0 2.0 ^' 实际输出:RecursionError:超过最大递归深度

1 个答案:

答案 0 :(得分:0)

if PrecedenceCheck(char) is True:发生了几次,但是PrecedenceCheck可以返回False或字符串,这两个都不是True。清理PrecedenceCheck最好总是返回一个布尔值,或者至少将条件更改为if PrecedenceCheck(char):并用手指指望它永远不会返回''

相关问题