【问题标题】:Conceptual issue occurred while converting infix notation to postfix notation将中缀表示法转换为后缀表示法时出现概念问题
【发布时间】:2015-07-09 15:07:02
【问题描述】:

在将中缀表示法转换为后缀表示法时,如何实现/理解运算符的优先顺序/优先级: “*”、“/”、“+”、“-”、“^”、“)”、“(”。

我知道人们可以只看一个算法来解决这个问题,但我不想那样做。我的思考过程应该是怎样的?

【问题讨论】:

  • @HighPerformanceMark 在解决像 ((A-B+C)^D+E*(F/G)) 这样的问题时,我可以想到 (A-B+C) 但真正的问题当“)”出现并且一切都开始变得模糊时开始 - 也许这是因为我是编程新手

标签: algorithm data-structures stack


【解决方案1】:

运算符优先级是正式中缀语言的约定和属性,用于指示应首先评估哪些操作。较高优先级的操作意味着它应该在较低优先级的操作之前运行。

分组括号不是运算符优先级的一部分。 (请注意,其他类型的括号,例如函数调用括号可能是,但是我假设您在这里没有引用这些括号)它们用于明确指示操作的顺序。括号仅用于指示中缀符号中的操作顺序。给定语言中运算符优先级约定的目的是在大多数情况下避免使用括号。因此,例如,如果我想将 4 乘以 5,然后将结果加上 7,我可以这样写:

4*5+7

这在普通算术运算符优先级规则下是有效的,因为乘法 ('*') 比加法 ('+') 具有更高的优先级。但是如果我想将 3 和 4 相加,然后将这个结果乘以 8,我需要这样写:

(3+4)*8

在这种情况下,我希望操作的顺序不同于“优先级较高的操作”的正常顺序。换句话说,只有当我们使用中缀表示法并希望操作以不同于优先顺序的顺序执行时,括号才是必需的。

在标准算术中,取幂(“^”)具有最高优先级。接下来是乘法和除法(同等优先级),最后是加法和减法。因此,使用这些不带括号的运算符编写的中缀表达式将首先计算所有求幂,然后是所有乘法和除法(从左到右顺序),最后是所有加法和减法,再次按照从左到右的顺序计算。

如果您想推断未知语言的运算符优先级,则需要查看使用括号和未使用括号的位置。由于即使在不必要的情况下也可以在任何地方使用括号,所以这只是一种启发式方法。对于上面的例子,我可以这样写:

((4*5)+7)

这并没有给出关于运算符优先级的提示。这是因为在这种情况下,每个二元运算符都有括号,因此假设加法和乘法的优先级不同,这两个集合中至少有一个是冗余的。

同样,看下一个例子:

(3+4)*8

由于加法而不是乘法使用了括号,我们可以推断在这种语言中加法的优先级可能低于乘法。否则,括号将是多余的。因此,寻找括号使用和不使用的模式,以尝试找出未知语言中的运算符优先级。更常见的是根据所考虑语言的正式规范假设某个优先级。大多数形式语言都有中缀形式的运算符优先级图表,以避免这种歧义。

我们从不需要前缀或后缀语言中的括号,因为术语和运算符的顺序已经明确了求值的顺序。因此,这个问题实际上是一个特定于中缀语言的问题。

【讨论】:

    【解决方案2】:

    如果括号平衡得当,您总能找到一个无括号的子表达式,从而将问题简化为这种情况。

    现在问问自己,根据优先规则,这样的表达式中应该先执行哪个操作?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      • 2015-02-15
      • 2014-08-26
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      • 2014-01-25
      相关资源
      最近更新 更多