当前位置: 首页 > 知识库问答 >
问题:

前缀表达式中的运算符关联性

赵河
2023-03-14

我正在讨论中缀、前缀和后缀的转换,我对以下表达式有疑问:

中缀:a b*d-i
下面的转换是我脑海中的转换。但是,下面的前缀表达式与联机转换工具不匹配
前缀:-a*bdi
后缀:abd*i-

当我在一些在线转换器中,甚至在我写的代码中放入上述infix时,我得到:
infix:a b*d-i
前缀:a-*bdi
Postfix:abd*i-

所以,我在这里的问题是,如果我们要计算上面的前缀,那么我们将在加法之前做减法,这在我看来是不正确的,因为根据运算符的关联性加法应该首先计算。这怎么正确?

共有1个答案

黄弘深
2023-03-14

您指向此处的联机转换器使用了错误的过程将中缀转换为前缀:https://www.web4college.com/converters/infix-to-postfix-prefix.php

它说(这是错误的,所以没有人复制它!):

  1. 反转内缀字符串
  2. 转换为后缀
  3. 反转后缀字符串得到前缀字符串

这篇文章的作者很困惑,因为:

  • 表达式的后缀或前缀形式是表达式树的后序或前序遍历;和
  • 您可以通过反转反转树的后序遍历来获得树的前序遍历

但是反转中缀表达式不会反转其表达式树,因为它具有左或右关联性。因此,给定的过程会产生错误的答案。

a-b-c TREE      REVERSED TREE       c-b-a TREE

    -                 -                 -
   / \               / \               / \
  -   c             c   -             -   a
 / \                   / \           / \
a   b                 b   a         c   b
 类似资料:
  • 使用的到算法: 输入: 预期输出: 实际输出: 如果当前运算符和堆栈顶部的运算符具有优先级,则检查它们的相关性, null null 然而,我的代码不适合于关联。有人能解释一下在上面的实现中如何处理关联性吗?

  • 使用表达式 例5.1 使用表达式 #!/usr/bin/python # Filename: expression.py length =5 breadth =2 area = length * breadth print'Area is', area print'Perimeter is', 2* (length + breadth) (源文件:code/expression.py) 输出 $

  • 我们将简单浏览一下运算符和它们的用法: 技巧 你可以交互地使用解释器来计算例子中给出的表达式。例如,为了测试表达式2 + 3,使用交互式的带提示符的Python解释器: >>> 2 + 3 5 >>> 3 * 5 15 >>> 表5.1 运算符与它们的用法 运算符 名称 说明 例子 + 加 两个对象相加 3 + 5得到8。'a' + 'b'得到'ab'。 - 减 得到负数或是一个数减去另一个数 -

  • 当你编写一个算术表达式如 B*C 时,表达式的形式使你能够正确理解它。在这种情况下,你知道 B 乘以 C, 因为乘法运算符 * 出现在表达式中。这种类型的符号称为中缀,因为运算符在它处理的两个操作数之间。看另外一个中缀示例,A+B*C,运算符 + 和 * 仍然出现在操作数之间。这里面有个问题是,他们分别作用于哪个运算数上,+ 作用于 A 和 B , 还是 * 作用于 B 和 C?表达式似乎有点模糊

  • 代码简介:我必须创建一个类来计算前缀、后缀或中缀表达式。它必须确定它是否是pre/post/infix,并将它们转换为后缀,例如,在从“/x7”转换为“x7/”的代码中,表达式在方法中从“x7/”编辑为“x7/”。这两种方法都很好,在多个示例上进行了测试(没有在这里发布完整的代码和作业,但也不需要它们。所问的问题只是我遇到的一个错误,不要担心,我不是在要求解决我的作业)。还有方法,因为可以有变量,