循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。可以用数组实现,也可以用循环链表实现
本篇讨论的是基于数组实现的环形队列
假定数组开辟了n个空间,由于队列空和满时候的rear和front的值,所以在数组中额外开辟一个空间,以便区分空和满
首先定义一个结构体:
typedef struct {
int *a;//数组
int front;//头
int rear;//尾
int k;//数组大小
} MyCircularQueue;
接下来是要实现的循环队列的功能:
MyCircularQueue(k)
: 构造器,设置队列长度为 k 。Front
: 从队首获取元素。如果队列为空,返回 -1 。Rear
: 获取队尾元素。如果队列为空,返回 -1 。enQueue(value)
: 向循环队列插入一个元素。如果成功插入则返回真。deQueue()
: 从循环队列中删除一个元素。如果成功删除则返回真。isEmpty()
: 检查循环队列是否为空。isFull()
: 检查循环队列是否已满。
MyCircularQueue:
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue*obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
obj->front=0;
obj->rear=0;
obj->k=k;
obj->a=(int *)malloc(sizeof(int *)*(k+1));
return obj;
}
记得要对队列开辟(n+1)个空间
isEmpty:
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
if(obj->rear==obj->front)
{
return true;
}
else{
return false;
}
}
当front的位置等于rear的位置时,循环队列为空
isFull:
bool myCircularQueueIsFull(MyCircularQueue* obj) {
if((obj->rear+1)%(obj->k+1)==obj->front)
{
return true;
}
else
{
return false;
}
}
当尾+1的位置等于头的时候,证明循环队列已满,但存在一种特殊情况,就是尾部是k的时候,这里就需要取余来处理这一情况
enQueue:
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if(!myCircularQueueIsFull(obj))
{
obj->a[obj->rear]=value;
obj->rear=(obj->rear+1)%(obj->k+1);
return true;
}
else
{return false;
}
}
这里的取余也是应对尾部从k变到0这种情况,但首先要进行判满
deQueue:
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if(!myCircularQueueIsEmpty(obj))
{
obj->front=(obj->front+1)%(obj->k+1);
return true;
}
else{
return false;
}
}
判空之后,只需要让头向前移动一位,但也存在从k变到0这种情况
Front
:
int myCircularQueueFront(MyCircularQueue* obj) {
if(!myCircularQueueIsEmpty(obj))
{
return obj->a[obj->front];
}
else{
return -1;
}
}
Rear
:
int myCircularQueueRear(MyCircularQueue* obj) {
if(!myCircularQueueIsEmpty(obj))
{
return obj->a[(obj->rear-1+obj->k+1)%(obj->k+1)];
}
else{
return -1;
}
}
取尾部元素存在一些不同,因为尾部对应的元素总是rear-1,当rear==0的时候取尾就需要进行特殊的取余
需要注意的是,上述进行的取余操作都是针对某一特殊情况,但进行的取余操作不会影响其他的普通情况,以上就是循环队列基本功能的实现