关于 c#:Converting Reverse Polish Notation

Converting Reverse Polish Notation

在使用 C 或 C# 时,有什么方法可以将逆波兰表示法解释为"正常"数学表示法?我在一家工程公司工作,所以他们偶尔会使用 RPN,我们需要一种方法来转换它。有什么建议吗?


是的。想想 RPN 计算器是如何工作的。现在,不是计算值,而是将操作添加到树中。因此,例如,2 3 4 + *,当您到达 时,而不是将 7 放入堆栈,而是将 (+ 3 4) 放入堆栈。同样,当您到达 * 时(您的堆栈在那个阶段看起来像 2 (+ 3 4) *),它变成 (* 2 (+ 3 4)).

这是前缀符号,然后您必须将其转换为中缀。从左到右遍历树,深度优先。对于每个"内部级别",如果运算符的优先级较低,则必须将运算放在括号中。那么,在这里,您会说 2 * (3 + 4),因为它的优先级低于 *.

希望这会有所帮助!

编辑:有一个微妙之处(除了上面没有考虑一元运算之外):我假设是左关联运算符。对于右关联(例如,**),对于 2 3 4 ** ** a?' (** 2 (** 3 4))2 3 ** 4 ** a?' (** (** 2 3) 4).

会得到不同的结果

从树中重构中缀时,两种情况都表明优先级不需要括号,但实际上后一种情况需要括号((2 ** 3) ** 4)。因此,对于右关联运算符,左侧分支需要更高优先级(而不是更高或等于)以避免括号。

另外,进一步的想法是您也需要 -/ 运算符的右侧分支的括号。


Shunting Yard 算法用于将中缀(即代数)转换为 RPN。这与您想要的相反。

你能给我举一个你的 RPN 输入的例子吗?我是一位资深的惠普计算器用户/程序员。我想你有一个包含所有输入的堆栈


C# 没有对解析逆波兰表示法 (RPN) 的内置支持。您需要编写自己的解析器,或者在网上找到一个。

有许多教程将后缀形式(RPN)转换为中缀(代数方程)。看看这个,也许你会发现它很有用,你可以试试逆向工程?它将后缀表达式转换为中缀形式,请记住,给定的后缀可以有多个中缀表示法。实际上讨论将后缀转换为中缀的有用示例很少。这是一个由两部分组成的条目,我发现它非常有用。它也有一些伪代码:

  • PostFix to Infix:将 RPN 转换为代数表达式
  • 后缀到中缀,第 2 部分:添加括号


n


n


n


n