使用C ++中的树评估Postfix表达式

时间:2013-10-31 09:43:09

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

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

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

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

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

  1. function eval(node)
  2. 的eval(节点 - >左)
  3. 的eval(节点 - >右)
  4. if(node是叶子节点) 把它推到堆栈上
  5. else if(node是一个操作数) 从堆栈中弹出a和pop b node-> value = a-> value op b-> value 删除b;
  6. 然而这不起作用。我还必须在每一步显示树,以显示减少的节点。 我用Google搜索了很多次,但我找不到所需的答案。 任何人都可以帮我解决这个问题。

    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;
            }
    

    }

2 个答案:

答案 0 :(得分:1)

您忘记了其他部分的obj2.push(temp->balue);

但是,有更多的错误,堆栈需要在函数调用之间共享,所以函数实际上可以处理它

答案 1 :(得分:0)

你有两个选择:

叶子的评估:

1 - 只需将值推到堆栈

non_leaf的评估:

1 - eval left, - 记住:eval结果已添加到堆栈中。

2 - eval right,

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);
}