您的位置:首页 > 其它

队列和循环队列

2017-03-21 20:37 218 查看
1.队列(Queue)

是一种运算受限的线性表。它只允许在表的一端进行插入,而在另一端进行删除。允许删除的一端称为队头(front),允许插入的一端称为队尾(rear)。队列也存在顺序存储结构和链式存储结构

队列具有先进先出原则,与栈的先进后出形成对比。



2.队列的顺序存储结构

为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列

什么叫假溢出呢?

为了防止出队时后面全部前移,我们设置一个头指针front(指向队头元素)和尾指针rear(指向队尾元素的下一个位置),当front=rear空队列



当我们将a1 a2出队,在后面再添加元素,rear移动到数组之外

另外随着添加元素会产生数组越界,但是前面还有a1 a2空出的位置,这就叫假溢出。即系统作为队列用的存储区还没有满,但队列却发生了溢出。

如何解决假溢出呢?

后面满了我们可以再从头开始!也就是头尾相接的循环,我们把这种头尾相接的顺序存储结构叫做循环队列。

当队列为空时,front=rear

如何判断队列满呢?


如图,这种情况rear=front,我们不取这种方式

我们可以修改队列满的条件,可以保留一个空间元素,也就是说,队列满时数组中还有一个空闲的单元



如图所示,rear可能比front大,也可能比front小,所以即使位置相近下标也可能差一圈

假设队列的最大尺寸为QueueSize,那么队列满的条件是(rear+1)%QueueSize==front

队列的长度:(rear-front+QueueSize)%QueueSize

3.队列的链式存储结构

其实就是线性表的单链表,只不过它只能尾进头出。简称为链队列。

我们把头指针指向头结点,队尾指针指向终端结点,空队列时,front和rear都指向头结点



入队操作:

即在链表尾部插入结点



出队操作:

头结点的后继结点出队,头结点指向下一个结点

若链表除了头结点只剩一个元素时,需将rear指向头结点



总的来说,在确定队列长度情况下,建议使用循环队列,否则使用链队列
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: