[英]How to access the call stack?
我有一个由父节点和子节点组成的树数据结构,如下所示:
<Node1>
<Node2/>
<Node3>
<Node4/>
</Node3>
</Node1>
要解析结构,我使用μ递归函数:
void RecursiveFunction(NodeT node)
{
if(node.has_child())
RecursiveFunction(node.child());
}
当我调用RecursiveFunction作为参数传递时,例如,Node2我希望能够访问父(Node1)数据而不使用其他数据结构存储这些数据,因为第一个节点的数据在制作之前已经存储在调用堆栈中递归调用。 因此,当我解析Node2无法直接访问父亲时,我需要访问调用堆栈以读取Node1的数据,依此类推。
例如,如果我正在解析Node4:
void RecursiveFunction(NodeT node)
{
/* Access to Node3 and Node1 data...
if(Node4.has_child())
RecursiveFunction(Node4.child()); */
}
可能吗? 以什么方式?
谢谢。
这是可能的,但这样做会非常危险。 这主要是因为你想搞乱进程堆栈。 另外我不认为有任何库函数可以这样做,据说你必须做一些指针算术来实现这一点。
即使您找到了一种从调用函数访问数据的方法,任何其他程序员都不容易理解您的操作。
我建议通过迭代替换递归,这应该允许您清楚地表达您想要做的事情。 有关更多信息,请参阅从递归到迭代的方法。
访问callstack对我来说有点过度工程。 将函数从递归转换为迭代并使用您自己的堆栈。 堆栈应包含一个NodeT实例和通知函数的整数值,已经处理了多少个节点的子节点。 如果此值低于节点的子计数,则循环将递增此值并将下一个子项添加到堆栈。 否则它将处理节点,然后从堆栈中弹出它。
另一个优点是,您不再受程序堆栈大小的限制,并且如果有这样的需要,您可以处理更多嵌套结构。 否则你冒险,好吧,让我们不要害怕说,堆栈溢出。
如果您想要或必须(例如家庭作业?)坚持递归,请将父节点作为第二个参数添加到您的函数中,默认为NULL
,表示当前节点是根节点。 即:
void RecursiveFunction(NodeT const& node, NodeT const* parentPtr=NULL)
{
if(node.has_child())
RecursiveFunction(node.child(), &node);
}
请注意,我修改了您的函数以通过引用const接受第一个参数,否则您将创建树的许多副本。
调用堆栈也用于函数参数*,因此使用它来构建链:
struct chain {
NodeT* node;
chain const* parent;
}
void RecursiveFunction(chain const& c)
{
if(c.node->has_child()) {
chain child = { c.node->child(), &c };
RecursiveFunction(child);
}
}
[*]至少在概念上; 实际实施可能不同。 无论如何,这个C ++代码是可移植的,与低级别的黑客不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.