将中缀表示法转换为后缀表示法时出现概念问题

时间:2015-07-09 15:07:02

标签: algorithm data-structures stack

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

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

2 个答案:

答案 0 :(得分:2)

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

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

4*5+7

这在正常的算术运算符优先级规则下有效,因为乘法(' *')的优先级高于加法(' +')。但是,如果我想添加3和4,然后将此结果乘以8,我需要写:

(3+4)*8

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

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

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

((4*5)+7)

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

同样,看下一个例子:

(3+4)*8

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

我们从不需要前缀或后缀语言中的括号,因为术语和运算符的顺序已经使评估顺序显式化。因此,这个问题实际上是一个特定于中缀语言的问题。

答案 1 :(得分:0)

如果括号正确平衡,你总能找到一个无括号的子表达式,这可以减少问题。

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