C语言 堆栈和数据结构

wtlkbnrh  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(165)

我是数据结构和算法的新手,我想问为什么有必要通过结构数据类型使用数组实现堆栈,我们可以直接使全局pop & push函数,全局数组& top变量,那么为什么我们创建一个结构,并在该结构中声明一个top变量和一个数组指针。
我试图理解使用数组实现堆栈的方法的优点或缺陷,其中一种是我们在结构中声明数组,另一种是我们直接创建全局数组。

6ojccjat

6ojccjat1#

一个完整的答案将需要一个很长,很长,很长的答案。它可能会变成基于观点的例子(这在SO上不受欢迎/禁止)。但下面我写了一些你新要考虑的事情。
你把两个不相关的东西混在一起了。使用结构(struct)并不妨碍您将堆栈设置为全局变量。不使用结构并不妨碍您使用本地堆栈。

int stack_data[N];     // Global stack
int stack_size = 0;    // without a struct

struct stack {
    int data[N];
    int size;
};
struct stack stack = {0};   // Global stack using struct

void foo(void) {
    int foo_stack_data[N];     // Local stack
    int foo_stack_index = 0;   // without a struct
    ...
    ...
}

void bar(void) {
    struct stack bar_stack = {0};  // Local stack using struct
    ...
    ...
}

换句话说,堆栈是全局的还是局部的,与struct的使用没有任何关系。
使用struct有几个原因。在struct中收集密切相关的变量,如“堆栈数据”和“堆栈大小”,在许多情况下会使代码更易于阅读和维护。
举个例子,假设你的程序需要100个堆栈。如果没有struct,你需要2 * 100 = 200行代码。对于struct stack,您只需要100行(加上4行用于定义)。随着与数据结构相关的变量数量的增加,情况会变得更糟。
如果你需要一个动态分配的堆栈,一个malloc的调用就可以使用struct,而你需要两个malloc的调用而不需要struct
全局变量嗯,在某些情况下,(一些)全局变量是有意义的。但是大量使用全局变量(几乎)总是会导致混乱。一个好的规则是避免全局变量,除非你有一个非常强的参数。
你看这个

int stack_data[N];     // Global stack
int stack_size = 0;    // without a struct

void push(int value) {
    // error check omitted
    stack_data[stack_size] = value;
    stack_size = stack_size + 1;
}

void bar(void) {
    push(42);
}

会有用的**但是...**如果我需要两叠或八叠呢?那么我应该写push函数的8个版本吗?听起来一点都不好玩...
所以我做了:

void push(int value, int* d, int* sz) {
    // error check omitted
    d[*sz] = value;
    *sz = *sz + 1;
}

void bar(void) {
    push(42, stack_data, &stack_size);
    push(65, another_stack_data, &another_stack_size);
}

传递与堆栈相关的变量允许我有多个堆栈。
但我必须同时传递数据和大小。两个论点。如果我需要5个变量来描述我的数据结构呢?那么我必须传递5个参数。除了所有的输入,它也会/可能会损害性能。
通过使用struct方法,我可以使用单个参数,即。一个指向struct变量的指针:

void push(int value, struct stack *s) {
    // error check omitted
    s->data[s->size] = value;
    s->size = s->size + 1;
}

void bar(void) {
    struct stack stack1 = {0};
    push(42, &stack1);
    struct stack stack2 = {0};
    push(65, &stack2);
    ...
}

相关问题