首页 > 编程语言 >循环队列的程序接口

循环队列的程序接口

时间:2024-04-26 18:55:27浏览次数:24  
标签:CirQueue 下标 队列 程序接口 DataType Manager 循环

循环队列的程序接口

目录

队列的说明

队列

image

循环队列

image

入队、出队

image

image

头文件

/*******************************************************************
 *
 *	file name:	循环队列的接口
 *	author	 :  [email protected]
 *	date	 :  2024-4-26
 *	function :	该程序实现循环队列元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以循环队列中元素
 * 				的数据类型为DataType_t,用户可以根据实际情况修改循环队列中元素的类型。另外,
 * 				为了方便管理循环队列,所以用户设计SeqList_t结构体,该结构体中包含三个成员:地址+容量+有效元素的下标
 * 	note	 :  None
 *
 *	CopyRight (c)  2024-4-26   [email protected]   All Right Reseverd
 *
 * *****************************************************************/
#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;
/********************************************************************
 *
 *	name	 :	CirQueue_Create
 *	function :  创建循环队列并对循环队列进行初始化
 *	argument :
 *	retval	 :  CirQueue_t* 循环队列的结构体地址
 *	author	 :  [email protected]
 *	date	 :  2024-4-25
 * 	note	 :	None
 *
 * *****************************************************************/
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_IsEmpty(CirQueue_t *Manager)
{
	return (Manager->Front == Manager->Rear) ? true : false;
}

入队

/********************************************************************
 *
 *	name	 :	CirQueue_Enqueue
 *	function :  循环队列的入队
 *	argument :	@Manager	操作的目标队列
 *				@Data		入队数据
 *	retval	 :  返回1成功0失败
 *	author	 :  [email protected]
 *	date	 :  2024-4-26
 * 	note	 :	None
 *
 * *****************************************************************/

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;
}

出队

/********************************************************************
 *
 *	name	 :	CirQueue_Dequeue
 *	function :  循环队列的出队
 *	argument :	@Manager	操作目标队列
 *	retval	 :  DataType_t出栈数据
 *	author	 :  [email protected]
 *	date	 :  2024-4-25
 * 	note	 :	None
 *
 * *****************************************************************/

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[])
{
	CirQueue_t *Manager = CirQueue_Create(12);
	CirQueue_Enqueue(Manager, 12);
	CirQueue_Enqueue(Manager, 11);
	CirQueue_Enqueue(Manager, 10);
	printf("%d", CirQueue_Dequeue(Manager));
	printf("\n");
	printf("%d ", CirQueue_Dequeue(Manager));
	printf("%d ", CirQueue_Dequeue(Manager));
	printf("%d ", CirQueue_Dequeue(Manager));
	printf("\n");
	return 0;
}

输出结果

12
11 10 CirQueue is Empty!
0 

标签:CirQueue,下标,队列,程序接口,DataType,Manager,循环
From: https://www.cnblogs.com/ljw-boke/p/18160697

相关文章

  • 单调队列优化DP
    单调队列优化dp单调队列可以求某固定区间的最值,所以dp中需要求某固定区间的最值则可以考虑使用单调队列优化单调队列-滑动窗口https://www.luogu.com.cn/problem/P1886/**@Author:Danc1ng*@Date:2024-04-2416:06:34*@FilePath:P1886滑动窗口[模......
  • v-for 循环时直接使用 v-model 绑定报错
    报错信息:Youarebindingv-modeldirectlytoav-foriterationalias.Thiswillnotbeabletomodifythev-forsourcearraybecausewritingtothealiasislikemodifyingafunctionlocalvariable. 错误代码<divv-for="(item,index)indata":key......
  • 双向循环链表的删除、插入
    双向循环链表双向循环链表是一种特殊的链表结构,它结合了双向链表和循环链表的特点。在双向循环链表中,每个节点都有两个指针,一个指向前一个节点,另一个指向后一个节点,从而形成双向链接。同时,链表的头节点和尾节点相互链接,形成一个循环结构。这种结构使得双向循环链表在遍历和操作......
  • 双向循环链表的插入处理函数接口
    //方便访问,创建一个带头结点的双向循环链表//链表数据域取别名方便修改typedefintDataType_t;//构造双向循环链表的结点typedefstructDoubleCircularLList{DataType_tdata;//数据域structDoublLingkedList*prev;//直接前驱指针域......
  • 关于双向循环列表的插入、删除、遍历
    目录双向循环链表公式初始化双向循环链表构建双向循环链表结构体//双向循环链表节点定义typedefstructdouble_loop_node{chardata[DATA_LEN];//数据域,存储数据长度structdouble_loop_node*next;......
  • 单向循环链表实现头插、尾插、中间插、头删、尾删、中间删
    *name:单向循环链表*author:[email protected]*data:2024/04/23*function:设计一个单向循环链表,实现头插、尾插、中间插、头删、尾删、中间删*noto:None**CopyRight(c)[email protected]******......
  • 双向循环链表的增删改查功能
    数据结构双向循环链表双向循环链表的增删改查/****************************************************************************************************************** * filename : DoubleCirLinkedList.c* author : [email protected]* data : 2024/04/24* funct......
  • 基于c语言数据结构-双循环链表
    DoubleCircularLinkedList双循环链表/**************************************************************函数名称:*函数功能:设计双向循环链表的接口*函数参数:*返回结果:*注意事项:None*函数作者:zcx982795194@[email protected]*创建日期:2024/04/25*修......
  • 数据结构_链表_单向循环链表的初始化、插入、删除、修改、查询打印(基于C语言实现)
    版本:2024年4月25日V1.0发布于博客园/***@filename:CircularLinkedList.c*@brief:实现单向循环链表的相关功能*@author:[email protected]*@date:2024/04/25*@version:1.1*@note:*CopyRight(c)2023-2024RISE_A......
  • 数据结构——双向循环链表
    二、双向循环链表(一)双向循环链表的构造双向循环链表的首结点中的prev指针成员指向链表的尾结点,并且双向循环链表的尾结点里的next指针成员指向链表的首结点,所以双向循环链表也属于环形结构。1)构造双向循环链表的结点//双向链表中的结点有效数据类型,用户可以根据需要进行修......