循环队列是一个大小确定的特殊队列,它的特殊体现在循环,之前提到的普通队列,我们是用链表来实现的,在这里,由于循环队列是一个长度确定的队列,所以我们可以拿顺序表来实现。循环队列的操作与普通队列类似,不过不同的地方在于当rear走到capacity-1并且front在0号元素位置的时候,当此时再有元素入队,则不能入队,如果此时有元素出队,则可以继续入队。如下图
我们知道这个循环队列的capacity是6,此时图中所示表示该循环队列已满,则此时不能在入队。讲到这里则就会有人想到,判断循环队列满队的时候,可以通过rear是否等于front来判断队列是否满队。这样是不可取的比如下图
当该队列出队时front和rear相遇,此时虽然它俩相等,但很明显此时队列不为空。所以为了便于判断循环队列是否满队,我们引入两个变量,分别代表该队列的容量capacity和当前队列大小size。
循环队列的创建
以下是创建循环队列的主体。
(这里为了方便描述,统一用int类型表示在实际编写中,大家可以用typedef来定义自己想要的数据类型。)
#include<stdio.h>
#include<stdlib.h>
typedef struct queue
{
int* array; //队列
int front; //头
int rear; //尾
int size; //当前大小
size_t capacity; //容量
}cqueue;
循环队列创建的接口
cqueue* cqueuecreat(size_t k) //循环队列的初始化
bool cqueueenqueue(cqueue* mq,int vaule) //入队
bool cququedequeue(cqueue* mq) //出队