可以跨越一本书中的链接堆栈和队列(并且它不是使用链接列表的堆栈/队列实现)。 它说如果只有一个堆栈/队列,则可以顺序表示堆栈/队列。但是,当多个堆栈/队列共存时,没有有效的方法来顺序表示它们。 下面是给出的代码
#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;
}
是数据结构的新手。我可以简要说明一下上述概念,即链接堆栈/队列。
答案 0 :(得分:0)
所以我检查了你的书,我有点理解你的问题所在。
如果我们只有一个堆栈或一个队列,则这种表示被证明是有效的。但是,当多个堆栈和队列共存时,没有有效的方法来顺序表示它们
因此,按顺序,您必须了解这意味着使用数组表示堆栈而不是链表。现在,假设您有一个包含10个数组的矩阵,分别代表大小为100的每个数组,然后将一些数据推入每个数组。假设您在每个堆栈中仅压入几个元素,结果是您浪费了很多数据,因为矩阵中有1000个元素。使用单个数组时存在此问题,但是当您有多个用于多个堆栈的数组时,此问题会更加明显。
现在,您可能已经了解到,使用堆栈的链表表示会占用所需的内存,而跟踪下一个元素(在本例中为stackpointer链接)的开销很小。
stackpointer top[MAX_STACKS]
所以我们在这里所做的是创建一个类型为stackpointer的数组,以跟踪每个单独堆栈的顶部位置。因此,现在每当用户希望输入元素时,他们都必须传递index(int i)以及数据(元素项)。
void push(int i ,element item)
{
stackpointer temp;
malloc(temp,sizeof(*temp));
temp->data = item;
temp->link = top[i];
top[i] = temp;
}
所以我们要做的是创建一个临时变量来存储我们的数据,该变量现在将成为堆栈的顶部,但是在这样做之前,我们必须将其指向堆栈的前一个顶部(在第5行中完成),然后在第6行中,我们仅将top [i]指向temp。 但是,您可能要使用
来更正您的代码stackpointer temp = (stackpointer)malloc(sizeof(element));
如果您对malloc有疑问,请参考this。 如果您有疑问,请告诉我,我会澄清您需要的任何内容。