循环队列的实现

循环队列

一段链表或者数组可以重复利用,通常是定长的,因此要多开辟一个空间作为缓冲区。当满了还要继续插入,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;
}

奶奶常说,把每一天都当作最后一天来过…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值