1

除了 Dijkstra 调车场算法之外,还有什么方法可以将中缀转换为 RPN 吗?我试图通过将其与另一种转换方法进行比较来研究调车场算法的弱点和优势。非常感谢任何与调车场算法期刊的链接。谢谢

4

2 回答 2

2

在现实生活中,我总是递归地解析表达式。

在 python 中,基本算法如下所示:

import re
import sys

def toRpn(infixStr):
    # divide string into tokens, and reverse so I can get them in order with pop()
    tokens = re.split(r' *([\+\-\*\^/]) *', infixStr)
    tokens = [t for t in reversed(tokens) if t!='']
    precs = {'+':0 , '-':0, '/':1, '*':1, '^':2}

    #convert infix expression tokens to RPN, processing only
    #operators above a given precedence
    def toRpn2(tokens, minprec):
        rpn = tokens.pop()
        while len(tokens)>0:
            prec = precs[tokens[-1]]
            if prec<minprec:
                break
            op=tokens.pop()

            # get the argument on the operator's right
            # this will go to the end, or stop at an operator
            # with precedence <= prec
            arg2 = toRpn2(tokens,prec+1)
            rpn += " " + arg2 + " " +op
        return rpn

    return toRpn2(tokens,0)

print toRpn("5+3*4^2+1")

#prints: 5 3 4 2 ^ * + 1 +

这种形式很容易适应处理括号、一元运算符和像赋值运算符一样从右到左关联的运算符。

请注意,上面的代码没有适当地处理语法错误。

于 2016-12-15T18:26:30.117 回答
1

当然还有 LR 解析器、解析器组合器,可能还有许多其他类型的解析器

于 2016-12-15T13:48:58.173 回答