C语言 链接堆栈和队列



在一本书中遇到了链接堆栈和队列(它不是使用链表的堆栈/队列实现(。 它说如果我们只有一个堆栈/队列,堆栈/队列可以按顺序表示。但是,当多个堆栈/队列共存时,没有有效的方法来按顺序表示它们。 下面是给出的代码

#define MAX_STACKS 10 //maximum number of stacks;
typedef struct {
int key;
//other fields.
}element;
typedef struct stack *stackpointer;
typedef struct {
element data;
stackpointer link;
}stack;
stackpointer top[MAX_STACKS];
void push(int i ,element item) {
stackpointer temp;
malloc(temp,sizeof(*temp));
temp->data = item;
temp->link = top[i];
top[i] = temp;
}

我是数据结构的新手。我可以简要介绍上述概念,即链接堆栈/队列。

所以我看了你的书,我有点明白你的问题是什么。

如果我们只有一个堆栈或一个队列,这种表示被证明是有效的。但是,当多个堆栈和队列共存时,没有有效的方法来按顺序表示它们。

因此,通过顺序,您必须了解这意味着使用数组来表示堆栈而不是链表。现在假设您有一个由 10 个数组组成的矩阵来表示每个数组的大小为 100,然后将一些数据推送到每个数组中。假设你在每个堆栈中只推送几个元素,发生的情况是你最终浪费了大量数据,因为矩阵中有 1000 个元素。使用单个数组时存在此问题,但是当您有多个数组用于多个堆栈时,此问题变得更加明显。

现在您可能已经理解,使用堆栈的链表表示形式会根据需要使用尽可能多的内存,并且跟踪下一个元素(在本例中为堆栈指针链接(的开销很小。

stackpointer top[MAX_STACKS]

因此,我们在这里所做的是创建一个类型的堆栈指针数组,以跟踪每个堆栈的顶部位置。所以现在每当用户希望输入一个元素时,他们必须传递索引(int i(以及数据(元素项(。

void push(int i ,element item) 
{
stackpointer temp;
malloc(temp,sizeof(*temp));
temp->data = item;
temp->link = top[i];
top[i] = temp;
}

因此,我们要做的是创建一个 temp 变量来存储我们的数据,它现在将成为我们堆栈的顶部,但在这样做之前,我们必须将其指向堆栈的前一个顶部(在第 5 行完成(,在第 6 行中,我们只是将 top[i] 指向 temp。 但是,您可能希望使用此更正代码

stackpointer temp = (stackpointer)malloc(sizeof(element));

如果你有疑问,在malloc上,只需参考这个。 如果您有任何疑问,请告诉我,我会澄清您需要的任何事情。

最新更新