数据结构之循环队列

循环队列详解及其实现
本文介绍了循环队列的概念,由于顺序表在队列操作时可能导致效率低下,提出了循环队列的解决方案。循环队列通过队头和队尾指针在数组中形成循环结构,避免了假溢出问题,使得入队和出队操作的时间复杂度均为O(1)。文章还包含了循环队列的算法设计、C++实现以及测试过程。

一.引入

        假设线性表有 n 个数据元素,顺序表要求把表中的所有元素都存储在数组的前 n 个单元。假设队列有 n 个数据元素,顺序存储的队列也应该把队列的所有元素都存储在数组的前 n 个单元。如果把队头元素放在数组中下标为 0 的一端,则入队操作的时间开销仅为 O(1) ,此时的入队操作相当于追加,不需要移动元素;但是出队操作的时间开销为 O(n) ,因为要保证剩下的 n-1 个元素仍然存储在数组的前 n-1 个单元,所有元素都要向前移动一个位置。

        如果放宽队列的所有元素必须存储在数组的前 n 个单元这一条件,只要求队列的元素存储在数组中连续的位置,就可以得到一种更为有效的存储方法,此时入队和出队操作的时间开销都是 O(1) ,因为没有移动任何元素,但是队列的队头和队尾都是活动的,因此,需要设置队头、队尾两个指针,并且约定:队头指针 front 指向队头元素的前一个位置,队尾指针 rear 指向队尾元素。

        但是这种方法有一个新的问题。随着队列的插入和删除操作的进行,整个队列向数组中下标较大的位置移过去,从而产生了队列的 “单向移动性” 。当元素被插入到数组中下标最大的位置上之后,队列的空间就用尽了,尽管此时数组的低端还有空闲空间,这种现象叫做 “假溢出” 。

        解决假溢出的方法是将存储队列的数组看成是头尾相接的循环结构,即允许队列直接从数组中下标最大的位置延续到下标最大的位置延续到下标最小的位置。这通过取模操作很容易实现。队列的这种头尾相接的顺序存储结构成为循环队列。


二.算法设计

CirQueue.h

#ifnde
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值