队列(中)
上文最后,说到了循环队列的定义以及初始化操作,本文继续讲述循环队列的其他操作。
入队列(EnQueue)
void EnQueue(queue_r q,int num){
if((q.rear+1)%MaxSize==q.front) return;
q.data[q.rear]==num;
q.rear=(q.rear+1)%MaxSize;
}
插入元素前,首先要判断队列是否已经满了,如果队列已满,就立即return结束函数。
和顺序表实现普通队列的思想类似,只不过注意每一次插入数据元素,rear的值并不是简单的+1,而是取+1后整体模最大队列容量的余数,这点和普通队列并不一样。
出队列(DeQueue)
void DeQueue(queue_r q){
if(q.front==q.rear) return;
q.front=(q.front+1)%MaxSize;
}
在出队列前,首先也要进行判空操作,如果队列为空,代表顺序表中没有数据元素,无法删除,立即return结束函数。
出队列只需要让front的值等于+1后模最大队列容量的余数即可。
取队列队头元素
//单独取队列队头数据元素
int getTop_Q(queue_r q){
return q.data[front];
}
如果出队列时需要取队头元素,只需要改变DeQueue函数的数据类型,之后在判空语句之后加上int num=q.data[q.front],最后在函数结尾return num即可。
int DeQueue(queue_r q){
if(q.front==q.rear) return -9999;
int num=q.data[q.front];
q.front=(q.front+1)%MaxSize;
return num;
}
队列的链表实现(链式队列)
循环队列可以由顺序表实现,相应的,我们也可以用链表的结构来代替顺序表,而且这种结构可以更加直观地体现循环队列的特点。
我们一般把用链表实现的队列叫做链队列,和一般链表不同的是,它同时带有一个队列头指针front和队列尾指针rear,指向队列头结点,rear指向队列尾结点。一般来说,为了方便链表操作,我们往往使用带头结点的链表来实现。
相较于顺序表实现的队列,链表实现的队列更常用于数据经常变动的情况,而且链队列不存在队列满和溢出的问题。