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
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
是存储计算值的字段吗?如果是这样,堆栈的用途是什么?毕竟,您已经有了要使用的函数调用堆栈,如果使用递归而不是循环,则不需要显式堆栈,也不需要树来计算后缀。可能会给您一个表达式树作为输入,然后要求您将其转换为后缀,或者要求您直接对其求值,这也是可能的。请澄清。你的问题没有道理。我也尝试了同样的方法,使用迭代方法,但这对我也不起作用。我只是想知道我尝试使用的方法是否正确。还有其他方法吗?您基于堆栈的方法是正确的,除了一些细节和一些不清楚的实现之外。