调车场算法的反演是什么?
时间:2020-03-05 18:59:46 来源:igfitidea点击:
Dijkstra的Shunting Yard算法用于解析中缀符号并生成RPN输出。
我正在寻找相反的方法,一种将RPN转换为高中数学类风格的中缀表示法的方法,以便从数据库中表示RPN表达式,以易于理解的方式放置用户。
请节省时间,不要自己动手做算法,只给我指出我似乎找不到的教科书示例。从Shunting Yard算法向后工作,并使用我对记法的了解,我可能可以制定一个解决方案。我只是在寻找快速捷径,因此不必重新发明轮子。
哦,请不要将此标签标记为"作业",我发誓我已经失学了! ;-)
解决方案
回答
由于RPN也称为后缀表示法,因此我尝试使用谷歌搜索将"后缀转换为中缀",并获得了很多结果。前几个有代码示例,但是我发现RubyQuiz条目特别具有启发性。
回答
如果我们不担心删除多余的括号,那么下面的Lisp代码将起作用:
(defun rpn-to-inf (pre) (if (atom pre) pre (cond ((eq (car (last pre)) 'setf) (list (rpn-to-inf (first pre)) '= (rpn-to-inf (second pre)))) ((eq (car (last pre)) 'expt) (list (rpn-to-inf (first pre)) '^ (rpn-to-inf (second pre)))) (t (list (rpn-to-inf (first pre)) (car (last pre)) (rpn-to-inf (second pre)))))))