转换反向波兰语表示法

时间:2020-03-06 14:31:33  来源:igfitidea点击:

使用C ++或者C#时,是否有任何方法可以将反向波兰语符号解释为"正常"数学符号?我在一家工程公司工作,所以他们偶尔使用RPN,我们需要一种转换它的方法。有什么建议?

解决方案

Ces没有内置的解析反向波兰表示法(RPN)的支持。我们需要编写自己的解析器,或者在线查找一个解析器。

有数十种教程将后缀形式(RPN)转换为中缀(代数方程式)。看一下这一点,也许我们会发现它很有用,并且可以尝试对其进行反向工程以将后缀表达式转换为中缀形式,请记住,给定后缀表示可以有多个中缀表示法。实际上,很少有有用的示例讨论将后缀转换为中缀。这是一个两部分的条目,我发现它非常有用。它还具有一些伪代码:

  • PostFix至Infix:将RPN转换为代数表达式
  • Postfix到infix,第2部分:添加括号

是的。考虑一下RPN计算器的工作原理。现在,不用计算值,而是将操作添加到树中。因此,例如,2 3 4 + *,当我们到达+时,而不是将7放入堆栈中,而是将((+ 3 4))放入堆栈中。同样,当我们到达时(堆栈在该阶段看起来像2(+ 3 4)*),它也变成了((2(+ 3 4)))。

这是前缀符号,然后必须将其转换为中缀。从左到右遍历树,首先进入深度。对于每个"内部级别",如果操作员的优先级较低,则必须将操作放在方括号中。那么,在这里,我们将说出" 2 (3 + 4)",因为+的优先级低于

希望这可以帮助!

编辑:有一个微妙之处(除了上面不考虑一元运算):我假设是左关联运算符。对于右关联(例如**),我们将获得2 3 4 ** **的不同结果? (** 2(** 3 4))与2 3 ** 4 ((** 2 3)4)`。

从树中重建中缀时,两种情况都表明优先级不需要括弧,但实际上后一种情况需要括起来(((2 ** 3)** 4`)。因此,对于右关联运算符,左分支需要具有更高的优先级(而不是更高或者更高)以避免包围。

另外,进一步的想法是,我们也需要为-/运算符的右分支加上括号。

分流码算法用于将Infix(即代数)转换为RPN。这与我们想要的相反。

我们能给我一个RPN输入示例吗?我是资深的HP计算器用户/程序员。我假设我们有一个包含所有输入和运算符的堆栈。我猜想我们需要重建表达式树,然后遍历该树以生成中缀形式。

一种方法是从Dragon Book的第二章中获取示例,该示例说明了如何编写解析器以将infix转换为postfix表示法并将其反转。

如果我们希望将某些源文本(字符串)从RPN(后缀表示法)转换为"普通表示法"(中缀),那么这肯定是可能的(并且可能不太困难)。

RPN是为基于堆栈的计算机而设计的,因为表示操作的方式(" 2 + 3"->" 2 3 +")适合实际在硬件上执行的方式(将" 2"推入堆栈,请按" 3"在堆栈上,将最上面的两个参数弹出堆栈,然后将其添加,然后推回堆栈)。

基本上,我们想通过在RPN之外创建两个要在"叶子节点"上操作的表达式以及该操作本身(随后是"父节点")来创建语法树。这可能是通过递归查看输入字符串来完成的(我们可能想要确保子表达式正确地加上了括号,以提高清晰度,如果还没有的话)。

一旦有了该语法树,就可以简单地通过对该树进行预排序,后排序或者有序遍历来输出前缀,中缀或者后缀表示法(同样,如果需要,可以在输出中加上括号以保持清晰度)。

一些更多的信息可以在这里找到。

如果我们可以阅读红宝石,则可以在此处找到一些很好的解决方案