栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

循环队列的实现

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

循环队列的实现

文章目录
  • 循环队列
  • 判断是否满不满
  • 满与空的演化
  • 空循环队列的判定
  • 空循环队列的创建
  • 循环队列的队尾插入
  • 循环队列的队头删除
  • 循环队列的头部元素
  • 循环队列的尾部元素
  • 循环队列的销毁
  • 循环队列的测试
  • 奶奶常说,把每一天都当作最后一天来过..

循环队列

一段链表或者数组可以重复利用,通常是定长的,因此要多开辟一个空间作为缓冲区。当满了还要继续插入,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
#include
#include
#include
//用数组实现 下标 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("循环队列是否为空:%dn", myCircularQueueIsEmpty(pm));
	printf("循环队列队头元素:%dn", myCircularQueueFront(pm));
	printf("循环队列队尾元素:%dn", myCircularQueueRear(pm));
	printf("循环队列满了吗:%dn", myCircularQueueIsFull(pm));
	myCircularQueueFree(pm);
	return 0;
}
奶奶常说,把每一天都当作最后一天来过…
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/938221.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号