在将中缀表示法转换为后缀表示法时,我如何了解/理解运算符的优先顺序/优先级:
" * ", " / ", " + ", " - ", " ^ ", " ) ", " ( ".
我知道一个人可以看一个算法来解决这个问题,但我不想这么做。我的思维过程应该是什么?
最佳答案
运算符优先级是一种形式中缀语言的约定和属性,用于指示应首先计算哪些操作。高优先级操作意味着它应该在低优先级操作之前操作。
分组括号不是运算符优先级的一部分。(注意,其他类型的圆括号,例如函数调用圆括号,但我假设您没有引用这里的圆括号)它们用于显式指示操作顺序括号只用于指示中缀表示法中的操作顺序给定语言中运算符优先约定的目的是在大多数情况下避免使用括号。例如,如果我想把4乘以5,然后再把7加到结果中,我可以写:
4*5+7
这在普通算术运算符优先规则下有效,因为乘法('*')的优先级高于加法('+')。但是如果我想加上3和4,然后把这个结果乘以8,我需要写:
(3+4)*8
在这种情况下,我希望操作的顺序不同于“优先级较高的操作优先”的正常顺序。换句话说,只有当我们使用中缀表示法并且希望操作以优先级顺序以外的顺序执行时,括号才是必需的。
在标准算术中,指数运算(“^”)具有最高优先级接下来是乘法和除法(同等优先级),最后是加法和减法因此,使用这些不带圆括号的运算符编写的中缀表达式将首先计算所有指数运算,然后计算所有乘法和除法(从左到右顺序),最后计算所有加法和减法,再次计算从左到右顺序。
如果要推断未知语言的运算符优先级,则需要查看括号所在的位置和不使用括号的位置。因为在任何地方使用圆括号都是有效的,即使不必要,这只是一种启发。对于上面的例子,我可以写:
((4*5)+7)
这并没有给出关于运算符优先级的提示这是因为在这种情况下,每个二进制运算符都有括号,因此,假设加法和乘法的优先级不相同,则两个集合中至少有一个是多余的。
同样,看下一个例子:
(3+4)*8
由于在加法而不是乘法周围使用了括号,我们可以推断出在这种语言中加法的优先级可能低于乘法否则,括号将是多余的。因此,寻找括号所在的模式,而不是试图找出未知语言中运算符的优先级。更常见的情况是,根据所考虑的语言的形式化规范假定一定的优先级。大多数形式语言都有中缀形式的运算符优先顺序表,以避免这种歧义。
在前缀或后缀语言中,我们不需要括号,因为术语和运算符的顺序已经使求值顺序显式。因此这个问题实际上是中缀语言特有的问题。
关于algorithm - 将中缀表示法转换为后缀表示法时发生概念问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31321436/