C++ 使用C+中的树计算后缀表达式+;

C++ 使用C+中的树计算后缀表达式+;,c++,expression-trees,postfix-notation,C++,Expression Trees,Postfix Notation,我应该使用表达式树计算后缀表达式。假设我有一棵这样的树 - / \ + * / \ / \ a b c d 我首先需要计算a+b子树并将其结果存储在+节点中,然后是c*d,依此类推,直到我将结果存储在根节点中 我尝试了使用堆栈的递归方法,但不起作用。伪代码如下所示 - / \ + * / \ / \ a b c d 功能评估(节点) 评估(节点->左) 评估(节点->右侧) if(节点是叶节点) 把它推到堆栈上 else if(

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

    -
   / \
  +   *
 / \  / \
a  b  c  d
我首先需要计算a+b子树并将其结果存储在+节点中,然后是c*d,依此类推,直到我将结果存储在根节点中

我尝试了使用堆栈的递归方法,但不起作用。伪代码如下所示

    -
   / \
  +   *
 / \  / \
a  b  c  d
  • 功能评估(节点)
  • 评估(节点->左)
  • 评估(节点->右侧)
  • if(节点是叶节点) 把它推到堆栈上
  • else if(节点是操作数) 从堆栈中弹出a和b 节点->值=a->值操作b->值 删除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;
            }
    
    }

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

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

    您有2个选项:

    叶的评估:

    1-只需将值推送到堆栈

    评估非叶片:

    1-左求值,-记住:求值结果添加到堆栈中

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

    到底是什么不起作用?请显示相关代码并准确描述哪些不起作用。您需要在步骤5A中将结果值推送到堆栈上递归方法没有明确使用堆栈:它使用递归时自动获得的激活帧堆栈。老实说,我不明白您的想法。首先,为什么在评估其子节点后检查节点是否为叶子?应该是相反的顺序吗?第二,
    node::value
    是存储计算值的字段吗?如果是这样,堆栈的用途是什么?毕竟,您已经有了要使用的函数调用堆栈,如果使用递归而不是循环,则不需要显式堆栈,也不需要树来计算后缀。可能会给您一个表达式树作为输入,然后要求您将其转换为后缀,或者要求您直接对其求值,这也是可能的。请澄清。你的问题没有道理。我也尝试了同样的方法,使用迭代方法,但这对我也不起作用。我只是想知道我尝试使用的方法是否正确。还有其他方法吗?您基于堆栈的方法是正确的,除了一些细节和一些不清楚的实现之外。