c - 使用C中的数据结构实现堆栈

标签 c stack

我正在尝试使用 C 中的数据结构来实现多个堆栈。问题是我无法从 main() 函数本身来做到这一点。

我创建了一个名为“stk”的自定义结构,其中包括一个整数数组、a[20] 和 top。现在,我通过在主函数中编写“stk s”来创建变量“s”。然后,我使用“s.top = -1”将“top”初始化为-1。但是,一旦我使用推送功能,顶部只会增加一次,即它达到 0 并且无论我推送多少次它都保持为零。我相信原因是因为我已将 's' 声明为 main() 中的局部变量而不是全局变量,并且 Push 函数的类型为 void,因此它停止了顶部的进一步增量。但是,如果我将其声明为全局变量,则一切正常,但同样,这样做将限制我只能使用一个堆栈,因为现在,我必须在推送函数内部指定“s”,因为它不会接受任何任意的值。

typedef struct
{
    int a[20];
    int top;
}stk;

stk s; 

void push(int x) //It'll only work for one stack i.e. "s"
{
    s.top++; 
    s.a[s.top] = x; 
}

int main()
{
    //I intend to declare "stk s, t" here
    s.top = -1;
}

有什么方法可以使用相同的结构来创建不同的堆栈,比如说“stk t”,但为此,我需要在 main 中将其声明为两个不同的变量,即“stk s, t”和然后使用按值传递进行推送?

最佳答案

通过指针向函数提供stk。这需要将 push 更改为:

typedef struct
{
    int a[20];
    int top;
} stk;

void push(stk *s, int x)
{
    ++s->top
    s->a[s.top] = x; 
}

stk gs; // global

int main()
{
    gs.top = -1;

    stk s; // local
    s.top = -1;

    // push 42 on the local stack
    push(&s, 42);

    // push 1 on the global stack
    push(&gs, 1);
}

我将进行边界检查以避免溢出的工作以及也许更简洁的初始化方法留给了您。但这就是相同的函数可以修改不同堆栈的方式。

关于c - 使用C中的数据结构实现堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57648755/

相关文章:

c - 确定添加到以太网帧的填充量

python - 如何读取describe_stack输出属性

带有堆栈变量的 C++ 头文件

C - 释放堆栈内数组内的特定结构

c - 如何从c中的bind()获取参数?

c - OpenCL 程序使用太多内存

c - 黑客挑战 - 定位代码中的漏洞

c - 使用 memcpy 而不是 malloc 将空间存储到堆栈中

c - 将节点插入已排序的双向链表

C 入门第 5 课 - 任务 14-6