【发布时间】:2013-11-11 06:00:31
【问题描述】:
我应该使用表达式树来评估后缀表达式。假设我有一棵这样的树
-
/ \
+ *
/ \ / \
a b c d
我首先需要评估 a+b 子树并将其结果存储在 + 节点中,然后 c*d 等等,直到我将结果存储在根节点中。
我尝试了使用堆栈的递归方法,但这不起作用。伪代码是这样的
- 函数评估(节点)
- eval(node->left)
- eval(node->right)
- 如果(节点是叶节点) 将其压入堆栈
- 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