链接的堆栈和队列

时间:2018-10-02 15:32:33

标签: c data-structures linked-list stack queue

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

#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;
}

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

1 个答案:

答案 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。 如果您有疑问,请告诉我,我会澄清您需要的任何内容。