/****************************************************************
* name;CirQueue_Create
* function: 创建循环队列
* parameter;unsighed int size
* ReValue;CirQueue_t *
* author;小北blog
* attention;
* date;2024.04.26
* history;
* version;
* Copyright(c) 2024 [email protected] All rights Reserved
*****************************************************************/
// 对将要处理的数据类型取别名,用户可以根据要求需要修改
typedef int DataType_t;
/*构造一个循环队列CircularQueue用来记录各项参数(循环队列的首地址 循环队列的容量
循环队列的循环队列的队首下标和队尾下标)并对结构体数据类型取别名*/
typedef struct CircularQueue
{
DataType_t *Adrr; // 记录循环队列首地址
unsigned int Size; // 记录循环列表容量大小
int Rear; // 记录循环队列队尾下标
int Front; // 记录循环队列队首下标
} CirQueue_t;
//(1)创建循环队列并对循环队列进行初始化,要申请管理指针和需要结构体中的指针申请内存
CirQueue_t *CirQueue_Circular(unsigned int size)
{
// 1.利用calloc为循环队列的结构体创建一个管理的指针并申请内存
CirQueue_t *Manager = (CirQueue_t *)calloc(1, sizeof(CirQueue_t));
// 判断是否申请成功
if (Manager == NULL)
{
perror("calloc memory for Manager failed!!!");
exit(-1); // 申请失败程序退出
}
// 2.利用calloc申请指针指向的空间申请内存
Manager->Adrr = (DataType_t *)calloc(size, sizeof(DataType_t));
// 判断是否申请成功
if (Manager->Adrr == NULL)
{
perror("calloc memory for Manager failed!!!");
free(Manager); // 申请失败释放前面申请成功的指针的内存防止内存溢出
exit(-1); // 申请失败程序退出
}
// 3.初始化结构体其他的类型(循环队列容量 队尾下标 队首下标)
Manager->Front = 0; // 对队首初始化
Manager->Rear = 0; // 对队尾初始化
Manager->Size = size; // 对循环队列的容量初始化
return Manager; // 返回管理指针
}
//(2)创建判断队列是否已满或已空供出队入队函数使用
/****************************************************************
* name;CirQueue_Full
* function: 判断队列是否满
* parameter;CirQueue_t *Manager
* ReValue;bool
* author;小北blog
* attention;
* date;2024.04.26
* history;
* version;
* Copyright(c) 2024 [email protected] All rights Reserved
*****************************************************************/
bool CirQueue_Full(CirQueue_t *Manager)
{
return ((Manager->Rear + 1) % Manager->Size == Manager->Front) ? true : false;
}
/*
空间换时间的案例,当最后一个元素不储存数据时,可以不用循环来判断循环队列是否未满,因为
循环队列为空的时候,队首队尾下标都是0,为满的时候也就是size大小的每个元素都存入数据的
时候,这时候队首队尾的下标也都是0,所以可以舍弃一个数据位来做判断是否未满,可以存入的
数据就为size-1个元素,即为满。存入数据满是队尾下标到了size位置,数据存满,为了防止下标
越界,Rear队尾下标等于size大小的时候等于零,也就是指向了队首。
*/
/****************************************************************
* name;CirQueue_Empty
* function: 判断队列是已空
* parameter;CirQueue_t *Manager
* ReValue;bool
* author;小北blog
* attention;
* date;2024.04.26
* history;
* version;
* Copyright(c) 2024 [email protected] All rights Reserved
*****************************************************************/
bool CirQueue_Empty(CirQueue_t *Manager)
{
return (Manager->Rear == Manager->Front) ? true : false;
}
/****************************************************************
* name;CirQueue_Enqueue
* function: 队列队尾入队
* parameter;
* @CirQueue_t *Manager
* @DataType_t data
* ReValue;bool
* author;小北blog
* attention;
* date;2024.04.26
* history;
* version;
* Copyright(c) 2024 [email protected] All rights Reserved
*****************************************************************/
//(3)把需要插入到循环队列的元素按照“先进先出”进行入队,此时需要从队列队尾入队
// 入队
bool CirQueue_Enqueue(CirQueue_t *Manager, DataType_t data) // 入队需要管理指针,传入的数据
{
// 1.判断队列是否为满
if (CirQueue_Full(Manager))
{
printf("CirQueue is Full");
return false;
}
// 2.如果队列有空闲的空间,把数据添加到队列尾部
Manager->Adrr[Manager->Rear] = data;
// 防止队尾下标越界
Manager->Rear = (Manager->Rear + 1) % Manager->Size;
return true;
}
/****************************************************************
* name;CirQueue_Dequeue
* function: 队列队首出队
* parameter;CirQueue_t *Manager
* ReValue;temp
* author;小北blog
* attention;
* date;2024.04.26
* history;
* version;
* Copyright(c) 2024 [email protected] All rights Reserved
*****************************************************************/
//(4)把需要插入到循环队列的元素按照“先进先出”进行出队,此时需要从队列队首出队
// 出队
DataType_t CirQueue_Dequeue(CirQueue_t *Manager) // 出队需要管理指针
{
// 备份出队的元素
DataType_t temp = 0;
// 1.判断队列是否为空
if (CirQueue_Empty(Manager))
{
printf("CirQueue is empty");
return false;
}
// 2.把队首元素出队,赋值到备份好的变量当中
temp = Manager->Adrr[Manager->Front];
// 防止队尾下标越界
Manager->Front = (Manager->Front + 1) % Manager->Size;
return temp;
}
思路和步骤
(1)创建循环队列并对循环队列进行初始化,要申请管理指针和需要结构体中的指针申请内存
(2)创建判断队列是否已满或已空供出队入队函数使用
(3)把需要插入到循环队列的元素按照“先进先出”进行入队,此时需要从队列队尾入队
(4)把需要插入到循环队列的元素按照“先进先出”进行出队,此时需要从队列队首出队