除了Dijkstra shunting yard算法之外还有任何方法可以将中缀转换为RPN吗?我正在尝试通过将其与另一种转换方法进行比较来研究分流码算法的弱点和优点。任何关于调车场算法的期刊的链接都非常感谢。感谢
答案 0 :(得分:1)
当然有LR解析,解析器组合器,可能还有很多其他kinds of parsers。
答案 1 :(得分:1)
在现实生活中,我总是递归地解析表达式。
在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 +
这个表单很容易适用于处理括号,一元运算符和从右到左关联的运算符。
请注意,上述代码不能正确处理语法错误。