文章目录
循环队列
一段链表或者数组可以重复利用,通常是定长的,因此要多开辟一个空间作为缓冲区。当满了还要继续插入,Front往后一个,再从尾部入队,直接覆盖,数组实现更方便
判断是否满不满
如果没有缓冲区,则空队列的时候,Front和Rear相等,满的时候它俩也相等
bool myCircularQueueIsFull(MyCircularQueue* obj)
{
assert(obj);
return (obj->rear + 1) % (obj->size) == (obj->front);
}
满与空的演化
空循环队列的判定
bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{
assert(obj);
return obj->front == obj->rear;
}
空循环队列的创建
#include<stdbool.h>
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
//用数组实现 下标 0 1 2 3
typedef struct
{
int* a;
int front;..下标指向头
int rear; ..下标指向尾
int size; ..记录空间大小:外部要求开辟n个 size = n+1
} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k)
{
MyCircularQueue* pc = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
pc->a = (int*)malloc(sizeof(int) * (k + 1));
pc->front = pc->rear = 0;
pc->size = k + 1;
return pc;
}
循环队列的队尾插入
void MyCircularQueueEnQueue(MyCircularQueue* obj, int value)
{
assert(obj);
if (!myCircularQueueIsFull(obj))
{
obj->a[obj->rear] = value;
obj->rear++;
obj->rear %= (obj->size);
}
else
{
printf("队列已经满了\n");
}
}
循环队列的队头删除
void myCircularQueueDeQueue(MyCircularQueue* obj)
{
assert(obj);
if (myCircularQueueIsEmpty(obj))
{
printf("队列为空,无法删除\n");
}
else
{
obj->front++;
obj->front %= (obj->size);
}
}
循环队列的头部元素
int myCircularQueueFront(MyCircularQueue* obj)
{
assert(obj);
if (myCircularQueueIsEmpty(obj))
{
return -1;
}
return obj->a[obj->front];
}
循环队列的尾部元素
int myCircularQueueRear(MyCircularQueue* obj)
{
assert(obj);
if (myCircularQueueIsEmpty(obj))
{
return -1;
}
rear 插入一个后要++,因此-1,参考上图,如果为0,则,,,,
int prevrear = obj->rear - 1;
if (prevrear == 0)
{
prevrear = obj->size - 1;
}
return obj->a[prevrear];
}
循环队列的销毁
void myCircularQueueFree(MyCircularQueue* obj)
{
assert(obj);
free(obj->a);
free(obj);
}
循环队列的测试
int main()
{
MyCircularQueue* pm = myCircularQueueCreate(3);
MyCircularQueueEnQueue(pm, 20);
MyCircularQueueEnQueue(pm, 30);
printf("循环队列是否为空:%d\n", myCircularQueueIsEmpty(pm));
printf("循环队列队头元素:%d\n", myCircularQueueFront(pm));
printf("循环队列队尾元素:%d\n", myCircularQueueRear(pm));
printf("循环队列满了吗:%d\n", myCircularQueueIsFull(pm));
myCircularQueueFree(pm);
return 0;
}