【问题标题】:How to evaluate any given expression如何评估任何给定的表达式
【发布时间】:2012-05-25 10:58:19
【问题描述】:

给定任何字符串表达式,你如何填充树?

我有一个任务,我被困住了。

我需要使用任何数据结构评估以下表达式(( 5 * 10 ) /2 - (( 2 + 3) + 6))

使用堆栈,我能够验证字符串的格式是否正确。但是如何将各种值添加到树中,然后按顺序评估它们。

请给我任何关于如何阅读字符串((( 490 * 9 ) / 2)/5/6 - (( 2/4 + 3) + 6 * 5))的提示

例如,当 (-) 是输入表达式中的第 15 个子字符串时,如何让 (-) 成为三个的根?如何确保 (/)6 表达式发生在 (/)5 等之后。

【问题讨论】:

标签: c++ data-structures binary-tree


【解决方案1】:
【解决方案2】:

计算任何字符串 [表示数学] 表达式

你需要做三件事:

  • 为代表您的语言的抽象语法树定义一个类型
  • 为您的语法编写递归下降解析器
  • 为您的语法编写解释器

你可以很容易地做到这一点。

我将使用 Haskell 表示法,因为它很简洁,但您可以根据需要进行翻译。

适合您语言的类型:

data Exp = Op BinOp Exp Exp
         | Lit Int

data BinOp = Plus
           | Times
           | Div
           | Sub

现在,我们可以为这种语言的表达式编写一个解释器:

eval :: Exp -> Int
eval (Lit n)      = n
eval (Op o e1 e2) = 
   let v1 = eval e1
       v2 = eval e2
   in case o of
       Plus  -> v1 + v2
       Times -> v1 * v2
       Sub   -> v1 - v2
       Div   -> v1 / v2 -- note, may fail!

好的。这就是您的语言中术语的评估器。现在写一个递归下降解析器...

【讨论】:

    【解决方案3】:

    括号表示操作的顺序,因此类似于您使用堆栈来确保所有匹配的内容,您可以解析出这些匹配项并将它们用作树中的元素来创建用于评估的层次结构,其中运算符是子级每个宽度级别的括号匹配。

    【讨论】:

      【解决方案4】:

      这里的其他答案包括将表达式树读入内存,但不包括在构建树后评估树。

      评估树的一般策略是树应该由节点和叶子组成,其中节点是有子节点的运算符,叶子是常量值。例如,表达式 (((490 * 9) / 2) / 5 / 6 - ((2 / 4 + 3) + 6 * 5)) 转换为树

      - / \ / \ div + / \ / \ 格 6 + * / \ / \ / \ 分区 5 分区 3 6 5 / \ / \ * 2 2 4 / \ 450 9

      要评估这棵树,请从根开始。您首先递归地评估左子树和右子树,然后将运算符应用于两个子树评估的结果。每个叶子(数字)都对自己求值。

      在这种情况下,您将从根 (-) 开始,将左子树计算为 73.5,将右子树计算为 33.5,然后减去得到最终结果 40。

      作为一个更精确的示例,让我们看看在进行了几层递归调用之后,树最左侧的节点。叶 450 计算为 450,叶 9 计算为 9,节点 (* 450 9)(以类似 Lisp 的前缀表示法编写树的节点)计算为 4050。因此,从节点 (/ (* 450 9) 2),左递归调用计算结果为 4050,正确的递归调用计算结果为 2,这意味着整个节点的计算结果为 2025。只要在组合值之前从节点进行递归调用,并确保每个叶子都对自身进行计算,树的计算就很简单了.

      【讨论】:

      • 虽然你在评估中做得很好,但你没有解释你是如何得到你的树的。这就是我的问题所在。你如何构建上面的树。我可以评估一棵已经制作的树,但是从 (((490 * 9) / 2) / 5 / 6 - ((2 / 4 + 3) + 6 * 5)) 那里构建一棵树,我仍然无法到。
      • 请注意,我已经根据之前的分配构建了一个 Inorder 解析器。这次我需要做的是,给定一个像上面这样的表达式,构建树,这样当我在我的二叉树上调用 print 时,我能够吐出完全相同的表达式。
      【解决方案5】:

      编辑第二个:op 澄清,查看其他答案

      【讨论】:

      • 哪一个?请注意我要问的实际问题。给定一个字符串,你如何构造一个符合输入的特定表达式的二叉树?
      • 我编辑了他的问题,但请不要这样编辑你的答案。 +1 不再意味着任何东西:) 在我看来你应该恢复它。
      猜你喜欢
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      相关资源
      最近更新 更多