关于 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


来源:https://www.codenong.com/113424/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_8759.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?