【问题标题】:Evaluate Postfix expression using a tree in C++在 C++ 中使用树评估 Postfix 表达式
【发布时间】:2013-11-11 06:00:31
【问题描述】:

我应该使用表达式树来评估后缀表达式。假设我有一棵这样的树

    -
   / \
  +   *
 / \  / \
a  b  c  d

我首先需要评估 a+b 子树并将其结果存储在 + 节点中,然后 c*d 等等,直到我将结果存储在根节点中。

我尝试了使用堆栈的递归方法,但这不起作用。伪代码是这样的

  1. 函数评估(节点)
  2. eval(node->left)
  3. eval(node->right)
  4. 如果(节点是叶节点) 将其压入堆栈
  5. else if(节点是操作数) 从堆栈中弹出 a 和弹出 b node->value = a->value op b->value 删除 a b;

然而这并没有奏效。我还必须在每一步都显示树,以显示正在减少的节点。 我用谷歌搜索了很多次,但我找不到所需的答案。 任何人都请帮助我如何做到这一点。

void expression_tree::evaluate(node *temp)
{
    if(!temp)
    return;
/// stack_postfix obj;
    stack_postfix obj2;
    evaluate(temp->left);
    evaluate(temp->right);
        if(temp->right == NULL && temp->left == NULL)
        {
            obj2.push(temp);
        }
        else
        {
            node * a = obj2.pop();
            node *b = obj2.pop();
            temp->value = a->value + b->value;
            delete a;
            delete b;
        }

}

【问题讨论】:

  • 究竟是什么不起作用?请显示相关代码并准确描述什么不起作用。
  • 您需要在步骤 5 中将结果值压入堆栈
  • 递归方法不使用堆栈显式:它使用递归时自动获得的激活帧堆栈。
  • 说实话,我无法理解你的想法。首先,为什么在评估其子节点后检查节点是否为叶子?那应该是相反的顺序吗?其次,node::value 是存储评估值的字段吗?如果是这样,您的堆栈的目的是什么?毕竟你已经有了要使用的函数调用堆栈,如果你使用递归而不是循环,你就不需要显式堆栈。
  • 你不需要树来评估后缀。可能会给您一个表达式树作为输入,然后需要将其转换 为后缀,或者您可能需要直接评估它,这也是可能的。请说清楚。你的问题没有意义。

标签: c++ expression-trees postfix-notation


【解决方案1】:

你在 else 部分忘记了obj2.push(temp->balue);

但是错误比较多,函数调用之间需要共享栈,所以函数可以实际处理它

【讨论】:

  • 我也尝试了使用迭代方法的相同方法,但这对我也不起作用。我只想知道我尝试使用的方法是否正确。还有其他方法吗?
  • 你的基于堆栈的方法是正确的,除了一些细节和有点不清楚的实现。
【解决方案2】:

你有两个选择:

叶子的评估:

1 - 只是将值压入堆栈

non_leaf 的评估:

1 - eval left, - REMEMBER: eval 结果添加到堆栈中。

2 - 评估正确,

3 - 弹出 2 个项目,

4 - 计算,

5 - 推送结果。

最后,您将在堆栈中有 1 个项目 - 最后一个结果

编辑:

void expression_tree::evaluate(node *temp, stack& s)
{
   if(!temp)
      return;

   if(temp->left != NULL && temp->right  != NULL){
       //only 1 pointer is illegal!
       evaluate(temp->left);
       evaluate(temp->right);
       node* n2 = s.pop();
       node* n1 = s.pop();
       //in the stack should be only leaves
       temp->value = n1->value + n2->value;//use switch by operator 
       delete temp->left; 
       temp->left = NULL;
       delete temp->right; 
       temp->right=NULL;
   }
   s.push (temp);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    相关资源
    最近更新 更多