转换反向波兰语表示法
使用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之外创建两个要在"叶子节点"上操作的表达式以及该操作本身(随后是"父节点")来创建语法树。这可能是通过递归查看输入字符串来完成的(我们可能想要确保子表达式正确地加上了括号,以提高清晰度,如果还没有的话)。
一旦有了该语法树,就可以简单地通过对该树进行预排序,后排序或者有序遍历来输出前缀,中缀或者后缀表示法(同样,如果需要,可以在输出中加上括号以保持清晰度)。
一些更多的信息可以在这里找到。
如果我们可以阅读红宝石,则可以在此处找到一些很好的解决方案