conversion from infix to prefix

后端 未结 14 1316
有刺的猬
有刺的猬 2020-12-09 10:24

I am preparing for an exam where i couldn\'t understand the convertion of infix notation to polish notation for the below expression:

(a–b)/c*(d + e – f / g)         


        
14条回答
  •  萌比男神i
    2020-12-09 10:56

    https://en.wikipedia.org/wiki/Shunting-yard_algorithm

    The shunting yard algorithm can also be applied to produce prefix notation (also known as polish notation). To do this one would simply start from the end of a string of tokens to be parsed and work backwards, reverse the output queue (therefore making the output queue an output stack), and flip the left and right parenthesis behavior (remembering that the now-left parenthesis behavior should pop until it finds a now-right parenthesis).

    from collections import deque
    def convertToPN(expression):
        precedence = {}
        precedence["*"] = precedence["/"] = 3
        precedence["+"] = precedence["-"] = 2
        precedence[")"] = 1
    
        stack  = []
        result = deque([])
        for token in expression[::-1]:
            if token == ')':
                stack.append(token)
            elif token == '(':
                while stack:
                    t = stack.pop()
                    if t == ")": break
                    result.appendleft(t)
            elif token not in precedence:
                result.appendleft(token)
            else:
                # XXX: associativity should be considered here
                # https://en.wikipedia.org/wiki/Operator_associativity
                while stack and precedence[stack[-1]] > precedence[token]:
                    result.appendleft(stack.pop())
                stack.append(token)
    
        while stack:
            result.appendleft(stack.pop())
    
        return list(result)
    
    expression = "(a - b) / c * (d + e - f / g)".replace(" ", "")
    convertToPN(expression)
    

    step through:

    step 1 : token ) ; stack:[ ) ]
    result:[  ]
    step 2 : token g ; stack:[ ) ]
    result:[ g ]
    step 3 : token / ; stack:[ ) / ]
    result:[ g ]
    step 4 : token f ; stack:[ ) / ]
    result:[ f g ]
    step 5 : token - ; stack:[ ) - ]
    result:[ / f g ]
    step 6 : token e ; stack:[ ) - ]
    result:[ e / f g ]
    step 7 : token + ; stack:[ ) - + ]
    result:[ e / f g ]
    step 8 : token d ; stack:[ ) - + ]
    result:[ d e / f g ]
    step 9 : token ( ; stack:[  ]
    result:[ - + d e / f g ]
    step 10 : token * ; stack:[ * ]
    result:[ - + d e / f g ]
    step 11 : token c ; stack:[ * ]
    result:[ c - + d e / f g ]
    step 12 : token / ; stack:[ * / ]
    result:[ c - + d e / f g ]
    step 13 : token ) ; stack:[ * / ) ]
    result:[ c - + d e / f g ]
    step 14 : token b ; stack:[ * / ) ]
    result:[ b c - + d e / f g ]
    step 15 : token - ; stack:[ * / ) - ]
    result:[ b c - + d e / f g ]
    step 16 : token a ; stack:[ * / ) - ]
    result:[ a b c - + d e / f g ]
    step 17 : token ( ; stack:[ * / ]
    result:[ - a b c - + d e / f g ]
    
    # the final while
    step 18 : token ( ; stack:[  ]
    result:[ * / - a b c - + d e / f g ]
    

提交回复
热议问题