【问题标题】:Stucked with Reverse Polish Notation卡在逆波兰符号
【发布时间】:2019-09-10 12:24:21
【问题描述】:

我有一个作业:当我们输入像 -(2 + 3) * 1/5 这样的数学表达式时,输出应该是 -1。经过一番研究,我发现RPN算法是解决这个问题的方法。所以我所做的是将表达式从中缀转换为后缀。但问题是在某些情况下我无法确定操作数,例如:

Input: 11+((10-2)*6)+7
Infix-to-Postfix-----------
Output: 11102-6*+7+  

“11”和“10”之间以及“10”和“2”之间没有空格,所以我无法正确确定每个操作数。 因为我的输出(后缀)是一个字符串,所以我完全不知道如何解决这个问题。有什么想法吗?

【问题讨论】:

  • 这是解决此问题的一种方法。对此有很多的想法;表达式解析是一个众所周知的问题,有许多示例和教程。请参阅How to Ask 页面:应提供非工作代码。
  • 你不想要一个令牌的串联,而是一个List<String> 的令牌。并且需要与具有一两个参数的减号运算符不同。
  • 要推送一个值(数字),请使用逗号运算符,这样您就有 11,10,2-6*+7+
  • 感谢您的建议,我正在努力!

标签: java algorithm rpn


【解决方案1】:

您在帖子中描述了问题 - 以及显而易见的解决方案:您选择的后缀输出破坏了原始表达式中的关键信息。显而易见的解决方案是您必须更改后缀例程以保留该信息。

特别的问题是您不能再将一串数字解析为原始整数。显而易见的解决方案是保留或插入一个独特的分隔符。当您发出(输出)一个整数时,请添加某种标点符号。由于 RPN 仅使用数字和少数运算符,因此请选择您自己容易检测和阅读的内容:空格、逗号或其他任何适合您的内容。

例如,如果您使用一个简单的空格,那么您的 RPN 格式为

11 10 2 -6 *+7 +

当您在 RPN 评估器中阅读此内容时,请将分隔符用作“推送整数”信号(或运算符)。

请注意,我已将此分隔符用作每个整数的终端字符,而不仅仅是连续整数之间的分隔符。使其成为终端可以简化输出处理和输入解析。决定是否添加该符号仅取决于一个标记(整数),而不是使其以两个相邻标记为条件(需要少量上下文状态)。

【讨论】:

    猜你喜欢
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多