队列的定义:插入操作(入队)在一端,删除操作(出队)在另一端的线性表。
其中,入队方向为队尾,出队方向为队头。
基于队列的操作共有6种:初始化空队列,释放队列所占用的存储空间,出队操作,入队操作,取队头元素,判空操作。
存储结构也和线性表一样,分为顺序存储和链接存储。
①顺序存储:循环队列的产生过程
由线性表在数组中的存储方式类比到队列在数组中的存储方式,将队头元素固定在数组下标为0处,但是队尾不固定,所以需要队尾指针指向队尾元素来完成入队操作,但是这样进行出队操作时,会带来大量的数据元素的移动,所以把队头元素移动,这样就需要一个队头指针。(约定队头指针指向队头元素的前一个位置)。随着插入操作与删除操作的进行,队列会向数组下标最大值单方向移动,导致“假溢出”(将元素插入到数组下标最大值时,无法在进行插入)。所以将数组的首尾相接,变成循环结构。产生了循环队列。接着在判空操作与判满操作时,两者的判定条件一样,front==rear,所以在判满时,认为数组有一个空闲单元即为队满状态。注意(循环+1即:(rear+1)%QueueSize)
②链接存储:链队列的头结点优点
链队列为了处理空链队列和非空链队列的操作语句一致,加上了头结点。
主要是针对入队操作:
当不加头结点时,空链队列front=rear=NULL
处理加上头结点的链队列和不加头结点的非空链队列语句:
s=new Node;s - >data=x;
s - >next=rear - >next;
rear -> next=s;
rear=s;
此时没有头结点的空链队列,rear=NULL,它的rear -> next没有意义
总结:在队列元素变化较大时,使用链队列
在队列元素变化较小时,使用循环队列
两个循环队列不能同时共享一个数组空间。