简体   繁体   中英

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. It is returning "RecursionError: maximum recursion depth exceeded". But I don't think that is the problem. I think it might be the PrecedenceCheck function

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

if PrecedenceCheck(char) is True: occurs several times, yet PrecedenceCheck can return False or a string, neither of which will be 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 '' .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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