首页 > 其他分享 >顺序循环队列的接口设计

顺序循环队列的接口设计

时间:2024-04-26 19:55:07浏览次数:21  
标签:顺序 队列 接口 Manager 循环 printf Front CirQueue

/********************************************************************************************************
 *
 *
 * 该程序实现循环队列元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以循环队列中元素
 * 的数据类型为DataType_t,用户可以根据实际情况修改循环队列中元素的类型。
 *
 * 另外,为了方便管理循环队列,所以用户设计SeqList_t结构体,该结构体中包含三个成员:地址+容量+有效元素的下标
 *
 *
 *
 * Copyright (c)  2023-2024   [email protected]   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;
	}

    //if(Manager->Front == Manager->Rear&&Manager->Front!=0)

	// 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->Addr[Manager->Front] = 0;

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


	return temp;
}

// 遍历顺序循环队列的元素
void CirQueue_Print(CirQueue_t *Manager)
{
    int pos = (Manager->Rear-Manager->Front+Manager->Size)%(Manager->Size);
    for (int i=0;i<pos;i++)
    {
        printf("data=%d\n", Manager->Addr[(Manager->Front+i)%(Manager->Size)]);
    }
}

int main(int argc, char const *argv[])
{

    // 1.创建顺序循环队列
    CirQueue_t *Manager = CirQueue_Create(7);

    // 2.向顺序循环队列中插入新元素
    printf("*********************************入队********************************\n");
    CirQueue_Enqueue(Manager, 5);
    CirQueue_Enqueue(Manager, 2);
    CirQueue_Enqueue(Manager, 1);
    CirQueue_Enqueue(Manager, 4);
    CirQueue_Enqueue(Manager, 6);

    // //3.遍历顺序循环队列
    CirQueue_Print(Manager); // -- 5 2 1 4 6
    printf("\n");
    // 4.向顺序循环队列中插入新元素
    printf("*********************************出队********************************\n");
    printf("出栈元素为%d\n", CirQueue_Dequeue(Manager));
    printf("出栈元素为%d\n", CirQueue_Dequeue(Manager));
    printf("出栈元素为%d\n", CirQueue_Dequeue(Manager));
    printf("出栈元素为%d\n", CirQueue_Dequeue(Manager));
    printf("出栈元素为%d\n", CirQueue_Dequeue(Manager));

    // //5.遍历顺序循环队列
    CirQueue_Print(Manager); // --空
    printf("\n");

    // 2.向顺序循环队列中插入新元素
    printf("*********************************入队********************************\n");
    CirQueue_Enqueue(Manager, 6);
    CirQueue_Enqueue(Manager, 4);
    CirQueue_Enqueue(Manager, 1);
    CirQueue_Enqueue(Manager, 2);
    CirQueue_Enqueue(Manager, 5);

    // //3.遍历顺序循环队列
    CirQueue_Print(Manager); // -- 6 4 1 2 5
    printf("\n");
    return 0;
}

标签:顺序,队列,接口,Manager,循环,printf,Front,CirQueue
From: https://www.cnblogs.com/eon4051/p/18160764

相关文章

  • 双向循环链表队列的接口设计
    /***********************************************************************************************************该程序实现循环队列元素的增删改查,目的是提高设计程序的逻辑思维,另外为了提高可移植性,所以循环队列中元素*的数据类型为DataType_t,用户可以根据实际情况......
  • 环形队列
    【简介】ringbuffer/circularbuffer又名环形队列/环形缓冲区,其通过开辟固定尺寸的内存来实现反复复用同一块内存的目的。由于预先开辟了固定尺寸的内容,所以当数据满的时候,可以有两种处理方式,具体使用哪一种按照实际需求,具体如下:1)当队列满的时候,新来的数据会覆盖最古老的......
  • 循环队列的程序接口
    循环队列的程序接口目录循环队列的程序接口队列的说明队列循环队列入队、出队头文件创建队空、队满的判断入队出队验证队列的说明队列循环队列入队、出队头文件/********************************************************************* filename: 循环队列的接口......
  • spring-接口大全
    1.Bean相关1.InitializingBeanInitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。demo@ComponentpublicclassMyInitBeanimplementsInitializingBean{publicvoidafterPro......
  • PHP身份实名认证接口小白也能轻松实现,ocr接口
    还在为网站用户的身份验证头疼不已?不要慌,今天就带你揭秘如何用PHP语言快速搭建起安全可靠的身份实名认证接口系统!只需对接身份证实名认证接口即可轻松实现用户身份的实名认证。那么,如何用PHP语言实现呢?其实很简单,登录翔云,找到开发者中心,下载所需要的接口开发语言,只需更......
  • 基于禅道restful接口的二次开发-获取token
    使用禅道的时候,可能会想用禅道的接口来做一些二次开发,比如获取缺陷情况、案例执行情况,做一些统计报表的展示。根据禅道开发文档中相关说明,在禅道开源版16.0+,专业版11.0+,企业版6.0+,旗舰版2.4+新增RESTful风格API,因此可以利用api来获取相关的数据访问地址:http://****/zentao/a......
  • qt封装dll并静态调用其它接口
    开发套件为QT5.9+MinGW编译器首先创建dll,第一步创建一个打开pro文件,因为我们创建的是app,需要的是dll,修改app->lib,注意不是dll其次,静态调用自己的底层库在工程中加入头文件,在pro添加dll的路径(注意这里静态调用没有用到lib文件)添加示例接口将编译的dll放入测试环境......
  • 练习题----顺序栈算法
    题目:​ 输入一个包括'('和')'的字符串string,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件:A.左括号必须用相同类型的右括号闭合。B.左括号必须以正确的顺序闭合。C.每个右括号都有一个对应的相同类型的左括号。题目分析:​ 该......
  • 单调队列优化DP
    单调队列优化dp单调队列可以求某固定区间的最值,所以dp中需要求某固定区间的最值则可以考虑使用单调队列优化单调队列-滑动窗口https://www.luogu.com.cn/problem/P1886/**@Author:Danc1ng*@Date:2024-04-2416:06:34*@FilePath:P1886滑动窗口[模......
  • 链栈的接口程序
    /***************************************************filename:LkStack.c*author:[email protected]*date:2024/04/25*brief:构建链栈*note:None**CopyRight(c)[email protected]********......