CircularQueue
/***********************************************************
*
* file name: CircularQueue interface
* author : [email protected]
* date : 2024/04/23
* function : Make great CV engineer
* note :
*
* CopyRight (c) 2023-2024 [email protected] All Right Resever
*
* ***********************************************************/
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
/********************************************************************************
*
*Function name:CircularQueue.c
*Function function:CircularQueue interface
*Function parameter:
*Return the result:
**atters needing attention:[email protected]
*Function author:
*Creation date:2024/04/26
*Modify history:
*Function version:v1.0
*
*******************************************************************************/
// 指的是循环队列中的元素的数据类型,用户可以根据需要进行修改
typedef int DataType_t;
// 构造记录循环队列Circu1 arQueue各项参数(循环队列的首地址+循环队列的容量+循环队列队尾下标+队首下标)的结构体
typedef struct CircularQueue
{
DataType_t *Addr; // 记录循环队列首地址
unsigned int Size; // 记录循环队列的容量
int Rear; // 循环队列队尾下标
int Front; // 循环队列队首下标
} CircQueue_t;
// 创建循环队列并对循环队列进行初始化
CircQueue_t *CircQueue_Create(unsigned int size)
{
// 1.利用ca11oc为循环队列的管理结构体申请一块堆内存
CircQueue_t *Manager = (CircQueue_t *)calloc(1, sizeof(CircQueue_t));
if (NULL == Manager)
{
perror("calloc memory for manager is failed!");
exit(-1); // 程序异常终止
}
// 2.利用ca11oc为所有元素申请堆内存
Manager->Addr = (DataType_t *)calloc(size, sizeof(DataType_t));
if (NULL == Manager->Addr)
{
perror("calloc memory for element is failed");
free(Manager);
exit(-1); // 程序异常终止
}
// 3.对管理循环队列的结构体进行初始化(循环队列容量+队尾下标+队首下标)
Manager->Size = size; // 对循环队列中的容量进行初始化
Manager->Rear = 0; // 队尾下标初值为0
Manager->Front = 0; // 队首下标初值为0
return Manager;
}
//判断循环队列是否已满
bool CircQueue_IsFull(CircQueue_t *Manager)
{
return ((Manager->Rear +1)%Manager->Size == Manager->Front )? true : false;
}
// 判断循环队列是否为空
bool CircQueue_IsEmpty(CircQueue_t *Manager)
{
return (Manager->Front = Manager->Rear) ? true : false;
}
// 入队
bool CircQueue_Enqueue(CircQueue_t *Manager, DataType_t Data)
{
// 1.判断循环队列是否已满
if (CircQueue_IsFull(Manager))
{
printf("CircQueue is Full!\n");
return false;
}
// 2.如果循环队列有空闲空间,则把新元素添加到循环队列尾部
Manager->Addr[Manager->Rear] = Data;
// 防止队尾下标越界
Manager->Rear = (Manager->Rear + 1) % Manager->Size;
return true;
}
// 出队
DataType_t CircQueue_Dequeue(CircQueue_t *Manager)
{
DataType_t temp = 0;
// 1.判断循环队列是否为空
if (CircQueue_IsEmpty(Manager))
{
printf("cirQueue is Empty!\n");
return false;
}
// 2.把元素从队首出队,并备份到变量temp
temp = Manager->Addr[Manager->Front];
// 防止队首下标越界
Manager->Front = (Manager->Front + 1) % Manager->Size;
return temp;
}
int main(int argc, char const *argv[])
{
CircQueue_t *Manager = CircQueue_Create(10);
CircQueue_Enqueue(Manager, 4);
CircQueue_Enqueue(Manager, 5);
return 0;
}
标签:下标,CircularQueue,队列,Manager,循环,return,CircQueue
From: https://www.cnblogs.com/xiaoyaoj/p/18160901