C 在递归函数中使用堆栈

C 在递归函数中使用堆栈,c,recursion,data-structures,C,Recursion,Data Structures,我需要在递归函数中使用堆栈。在函数递归调用之间,堆栈必须保留内容,并且只能通过函数内部的push或pop操作进行修改 一种方法是定义一个全局堆栈变量,如下所示: StackPtr stack = createStack(); 另一种方法是将堆栈传递给函数: int recursiveFunction(int n, StackPtr stack); 有没有一种方法可以做到这一点,但不需要全局堆栈或将堆栈传递给函数?其思想是完全封装函数,因此用户只需独立于程序规范调用它。这就像定义一个静态堆栈,

我需要在递归函数中使用堆栈。在函数递归调用之间,堆栈必须保留内容,并且只能通过函数内部的push或pop操作进行修改

一种方法是定义一个全局堆栈变量,如下所示:

StackPtr stack = createStack();
另一种方法是将堆栈传递给函数:

int recursiveFunction(int n, StackPtr stack);
有没有一种方法可以做到这一点,但不需要全局堆栈或将堆栈传递给函数?其思想是完全封装函数,因此用户只需独立于程序规范调用它。这就像定义一个静态堆栈,在递归调用之间保存堆栈内容

我试过:

int recursiveFunction(int n){
    static StackPtr stack = NULL;
    stack = createStack();
...
}
但是函数会在每次调用时重置堆栈。我必须以所示的方式创建堆栈,因为如果我放置:

static StackPtr stack = createStrack();
抛出“未初始化常量”错误

谢谢。

您可以这样做:

int recursiveFunction(int n){
  static StackPtr stack;

  if (stack == NULL)
    stack = createStack();

  ...
}
启动时,
堆栈
被初始化为
NULL
。 第一次调用
recursiveFunction
时,
stack
将被初始化。就这样


但是如果需要线程安全性,此解决方案将不起作用。

通常的解决方案是使用helper函数。main函数创建堆栈(或任何必要的对象),调用helper(实际的递归函数),然后在返回之前释放堆栈:

static int helper(StackPtr stack, int n) {
    ... /* Recursive calls to helper */
}

int mainFunction(int n){
    StackPtr stack = createStack();
    int rv = helper(stack, n)
    freeStack(stack);
    return rv;
}

通常应避免使用局部静态变量,因为它会使函数不可重入且线程不安全

可能是静态本地的?我将堆栈结构指针作为参数传递。另外,“StackPtr”是什么?它是一个类吗?您可以添加一个初始值为
false
的布尔变量
initialized
,以尝试使用静态堆栈。如果它是
false
(在第一次调用时会是这样),创建堆栈并将其标记为
true
。没有直接关系,但我会重新考虑设计。如果使用显式堆栈,为什么首先需要递归可能的重复,但每个返回地址、递归与否、每个本地堆栈帧、递归与否、每个保存的机器寄存器组都被存储/推送,然后由程序加载器和/或main()之前的启动代码从系统全局堆栈设置中弹出如果
createStack
freeStack
函数很昂贵,这可能不是最好的解决方案。无论如何,我对这个答案投了赞成票。我想避免使用堆栈参数调用函数。@carlitos_30:调用主函数,因此调用方不需要了解堆栈的任何信息。其余部分是实现细节。@michael:如果堆栈函数很昂贵,它们自己可以使用互斥保护池回收堆栈。然而,这是非常罕见的值得。@rici我明白你的意思。我把“main函数”和“main”函数混淆了。谢谢