数据结构-队列(中)

179 阅读2分钟

队列(中)

上文最后,说到了循环队列的定义以及初始化操作,本文继续讲述循环队列的其他操作。

入队列(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指向队列尾结点。一般来说,为了方便链表操作,我们往往使用带头结点的链表来实现。

相较于顺序表实现的队列,链表实现的队列更常用于数据经常变动的情况,而且链队列不存在队列满和溢出的问题。