队列的实现

/********************************************************************************************************
*
*	file name:	Zqh_队列实现.c
* 	author	 :	keyword2024@163.com
* 	date	 :	2024/05/05
* 	function :	实现队列的增删改查
*	note	 :	模板
*	
*  Copyright (c)  2023-2024   keyword2024@163.com    All right Reserved
* ******************************************************************************************************/


#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>




//指的是循环队列中的元素的数据类型,用户可以根据需要进行修改
typedef int  DataType_t;

//构造记录循环队列CircularQueue各项参数(循环队列的首地址 + 循环队列的容量 + 循环队列队尾下标+队首下标)的结构体
typedef struct CircularQueue
{
	DataType_t * Addr;		//记录循环队列首地址
	unsigned int Size;		//记录循环队列的容量
	int			 Rear;      //循环队列队尾下标	
	int			 Front;     //循环队列队首下标

}CirQueue_t;


//创建循环队列并对循环队列进行初始化
CirQueue_t * CirQueue_Create(unsigned int size)
{
	//1.利用calloc为循环队列的管理结构体申请一块堆内存
	CirQueue_t *Manager = (CirQueue_t *)calloc(1,sizeof(CirQueue_t));

	if(NULL == Manager)
	{
		perror("calloc memory for manager is failed");
		exit(-1); //程序异常终止
	}

	//2.利用calloc为所有元素申请堆内存
	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 CirQueue_IsFull(CirQueue_t *Manager)
{
	return ( (Manager->Rear + 1) % Manager->Size == Manager->Front ) ? true : false;
}


//入队
bool CirQueue_Enqueue(CirQueue_t *Manager, DataType_t Data)
{
	//1.判断循环队列是否已满
	if ( CirQueue_IsFull(Manager) )
	{
		printf("CirQueue is Full!\n");
		return false;
	}

	//2.如果循环队列有空闲空间,则把新元素添加到循环队列尾部
	Manager->Addr[Manager->Rear] = Data;


	//防止队尾下标越界
	Manager->Rear = (Manager->Rear+1) % Manager->Size;


	return true;
}





//判断循环队列是否为空
bool CirQueue_IsEmpty(CirQueue_t *Manager)
{
	return (Manager->Front == Manager->Rear) ? true : false;
}



//出队
DataType_t CirQueue_Dequeue(CirQueue_t *Manager)
{
	DataType_t temp =0;

	//1.判断循环队列是否为空
	if ( CirQueue_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[])
{

	
	return 0;
}


posted @ 2024-05-06 23:03  晖_IL  阅读(1)  评论(0编辑  收藏  举报