基于顺序存储的环形队列算法库构建

embedded/2024/10/20 14:50:20/

学习贺利坚老师基于数组的环形队列

数据结构之自建算法库——顺序环形队列_下空队列q中依次入队列数据元素abc-CSDN博客

本人详细引入博客

队列的定义-CSDN博客

本人详细讲解博客

队列的顺序存储结构-CSDN博客

环形队列引入详细讲解

环形队列的存储及基本操作_环形队列基本操作-CSDN博客

v2.0升级版本详细博客

拓展 : 环形队列的另一种设计_环形队列中有多少个元素可以根据队首指针和队尾指针的值来计算。-CSDN博客

版本更新日志

v1.0: 基于之前的逻辑框架 , 简单改名, 易于理解

v2.0: 基于第一种框架, 通过 队首尾指针进行指引的方式, 不能直接判断元素个数, 所以通过增加元素个数选项, 来提升队列可操作性

V1.0

算法库函数

//(1) 初始化顺序的循环队列
void Init_Sequential_circular_queue(Sequential_circular_queue *&init_queue);
//(2) 销毁顺序的循环队列
void Destroy_Sequential_circular_queue(Sequential_circular_queue *&destroy_queue);
//(3) 判断顺序循环队列是否为空
bool IsEmpty_Sequential_circular_queue(Sequential_circular_queue *judge_queue);
//(4) 测算循环队列的元素个数
int Length_Sequential_circular_queue(Sequential_circular_queue *measure_queue);
//(5) 入队元素
bool Enter_Sequential_circular_queue(Sequential_circular_queue *&enter_queue, ElemType enter_value);
//(6) 出队元素
bool Out_Sequential_circular_queue(Sequential_circular_queue *&Out_queue, ElemType &Out_value);

头文件

Sequential_circular_queue.h

#ifndef SEQUENTIAL_CIRCULAR_QUEUE_H_INCLUDED#define SEQUENTIAL_CIRCULAR_QUEUE_H_INCLUDED#define   MaxSize 8      //数组长度typedef char ElemType;//自定义队列类型//数组循环队列,自定义结构体
typedef struct
{ElemType data[MaxSize];//存储队列数据int Front;//队首指针int Rear;//队尾指针}Sequential_circular_queue;//(1) 初始化顺序的循环队列
void Init_Sequential_circular_queue(Sequential_circular_queue *&init_queue);
//(2) 销毁顺序的循环队列
void Destroy_Sequential_circular_queue(Sequential_circular_queue *&destroy_queue);
//(3) 判断顺序循环队列是否为空
bool IsEmpty_Sequential_circular_queue(Sequential_circular_queue *judge_queue);
//(4) 测算循环队列的元素个数
int Length_Sequential_circular_queue(Sequential_circular_queue *measure_queue);
//(5) 入队元素
bool Enter_Sequential_circular_queue(Sequential_circular_queue *&enter_queue, ElemType enter_value);
//(6) 出队元素
bool Out_Sequential_circular_queue(Sequential_circular_queue *&Out_queue, ElemType &Out_value);#endif //SEQUENTIAL_CIRCULAR_QUEUE_H_INCLUDE

库函数实现

Sequential_circular_queue.cpp

/*****************************************
功  能: 基于顺序存储的环形队列
编程人: 王涛
时  间: 2024.6.22
版  本: V1.0
******************************************/
#include <stdio.h>
#include <malloc.h>
#include "Sequential_circular_queue.h"/**************************************************
(1)函数名: Init_Sequential_circular_queue
功  能: 初始创建的顺序循环队列
参  数: (1)Sequential_circular_queue *&init_queue:要初始化的顺序队列
返回值: 无
**************************************************/void Init_Sequential_circular_queue(Sequential_circular_queue *&init_queue)
{init_queue = (Sequential_circular_queue*)malloc(sizeof(Sequential_circular_queue));init_queue->Front = 0;init_queue->Rear = 0;
}/**************************************************
(2)函数名: Destroy_Sequential_circular_queue
功  能: 销毁顺序存储的循环队列
参  数: (1)Sequential_circular_queue *&destroy_queue: 要销毁的队列
注  意: 传入的是 *& 指针地址, 所以可以修改原函数
返回值: 无(只有成功,没有失败)
**************************************************/
void Destroy_Sequential_circular_queue(Sequential_circular_queue *&destroy_queue)
{free(destroy_queue);
}/**************************************************
(3)函数名: IsEmpty_Sequential_circular_queue
功  能: 判断顺序循环队列是否为空
参  数: Sequential_circular_queue *&judge_queue:要判断的
返回值: bool:判断是队列是否为空
**************************************************/
bool IsEmpty_Sequential_circular_queue(Sequential_circular_queue *judge_queue)
{//队首,队尾重合,则队列为空return (judge_queue->Front == judge_queue->Rear);
}/**************************************************
(4)函数名: Length_Sequential_circular_queue
功  能: 测算循环队列的元素个数
参  数: Sequential_circular_queue *&measure_queue:要进行测量元素个数的队列
返回值: int: 返回队列元素个数/长度
**************************************************/
int Length_Sequential_circular_queue(Sequential_circular_queue *measure_queue)
{return (measure_queue->Rear - measure_queue->Front+MaxSize)%MaxSize;
}/**************************************************
(5)函数名: Enter_Sequential_circular_queue
功  能:入队元素
参  数:(1)Sequential_circular_queue *&enter_queue:入队元素的队列(2)ElemType enter_value:入队的元素值
返回值:bool: 是否队满? 是,成功:否,失败
**************************************************/
bool Enter_Sequential_circular_queue(Sequential_circular_queue *&enter_queue, ElemType enter_value)
{//判断防止队满上溢if((enter_queue->Rear+1)%MaxSize == enter_queue->Front){return false;}enter_queue->Rear = (enter_queue->Rear + 1)%MaxSize;enter_queue->data[enter_queue->Rear] = enter_value;return true;
}/**************************************************
函数名: Out_Sequential_circular_queue
功  能:出队元素
参  数:(1)Sequential_circular_queue *&Out_queue:出队队列(2)ElemType &Out_value:出队队列元素值
注  意: 出队队列,要进行修改,所以是*&(指针地址)并且要传回出队元素的数值,所以也用的是 &(地址)
返回值: bool: 出队成功? 队非空,成功:队空,失败
**************************************************/
bool Out_Sequential_circular_queue(Sequential_circular_queue *&Out_queue, ElemType &Out_value)
{if(IsEmpty_Sequential_circular_queue(Out_queue))//判断为空,则跳出{return false;}Out_queue->Front = (Out_queue->Front + 1)%MaxSize; //锁定出队元素序号Out_value = Out_queue->data[Out_queue->Front];//传回出队数值return true;
}

主函数测试

main.cpp

#include <stdio.h>
#include "Sequential_circular_queue.h"int main()
{ElemType test_data1;Sequential_circular_queue *test_queue1;printf("(1)初始化队列test_queue1\n");Init_Sequential_circular_queue(test_queue1);printf("(2)依次进队列元素 a b c \n");if(Enter_Sequential_circular_queue(test_queue1,'a') == 0){printf("\n队满, 不能进队!\n");}if(Enter_Sequential_circular_queue(test_queue1,'b') == 0){printf("\n队满, 不能进队!\n");}if(Enter_Sequential_circular_queue(test_queue1,'c') == 0){printf("\n队满, 不能进队!\n");}printf("\n(3)队列为%s\n",(IsEmpty_Sequential_circular_queue(test_queue1)?"空":"非空"));if(Out_Sequential_circular_queue(test_queue1, test_data1) == 0){printf("队空, 不能出队\n");}else{printf("(4)出队一个元素 %c \n", test_data1);}printf("(5)队列test_queue1的元素个数:%d\n", Length_Sequential_circular_queue(test_queue1));printf("(6) 依次进队列元素 d e f\n");test_data1 = 'd';if(Enter_Sequential_circular_queue(test_queue1, test_data1) == 0){printf("\n队满,%c不能进队\n",test_data1);}test_data1 = 'e';if(Enter_Sequential_circular_queue(test_queue1, test_data1) == 0){printf("\n队满,%c不能进队\n",test_data1);}test_data1 = 'f';if(Enter_Sequential_circular_queue(test_queue1, test_data1) == 0){printf("\n队满,%c不能进队\n",test_data1);}printf("\n(7) 队列test1的元素个数是%d\n", Length_Sequential_circular_queue(test_queue1));printf("(8)出队列序号:");while(!IsEmpty_Sequential_circular_queue(test_queue1)){Out_Sequential_circular_queue(test_queue1,test_data1);printf("\n%c\n",test_data1);}printf("\n");printf("(9)释放队列\n");Destroy_Sequential_circular_queue(test_queue1);return 0;}

运行结果

V2.0

算法库函数

//(1) 初始化顺序的循环队列
void Init_Sequential_circular_queue(Sequential_circular_queue *&init_queue);
//(2) 销毁顺序的循环队列
void Destroy_Sequential_circular_queue(Sequential_circular_queue *&destroy_queue);
//(3) 判断顺序循环队列是否为空
bool IsEmpty_Sequential_circular_queue(Sequential_circular_queue *judge_queue);
//(4) 判断顺序循环队列是否队满
bool IsFull_Sequential_circular_queue(Sequential_circular_queue *judge_queue);
//(5) 测算循环队列的元素个数
int Length_Sequential_circular_queue(Sequential_circular_queue *measure_queue);
//(6) 入队元素
bool Enter_Sequential_circular_queue(Sequential_circular_queue *&enter_queue, ElemType enter_value);
//(7) 出队元素
bool Out_Sequential_circular_queue(Sequential_circular_queue *&Out_queue, ElemType &Out_value);

头文件

Sequential_circular_queue.h

#ifndef SEQUENTIAL_CIRCULAR_QUEUE_H_INCLUDED#define SEQUENTIAL_CIRCULAR_QUEUE_H_INCLUDED#define   MaxSize 8      //数组长度typedef char ElemType;//自定义队列类型//数组循环队列,自定义结构体
typedef struct
{ElemType data[MaxSize];//存储队列数据int Front;//队首指针int element_count;}Sequential_circular_queue;//(1) 初始化顺序的循环队列
void Init_Sequential_circular_queue(Sequential_circular_queue *&init_queue);
//(2) 销毁顺序的循环队列
void Destroy_Sequential_circular_queue(Sequential_circular_queue *&destroy_queue);
//(3) 判断顺序循环队列是否为空
bool IsEmpty_Sequential_circular_queue(Sequential_circular_queue *judge_queue);
//(4) 判断顺序循环队列是否队满
bool IsFull_Sequential_circular_queue(Sequential_circular_queue *judge_queue);
//(5) 测算循环队列的元素个数
int Length_Sequential_circular_queue(Sequential_circular_queue *measure_queue);
//(6) 入队元素
bool Enter_Sequential_circular_queue(Sequential_circular_queue *&enter_queue, ElemType enter_value);
//(7) 出队元素
bool Out_Sequential_circular_queue(Sequential_circular_queue *&Out_queue, ElemType &Out_value);#endif //SEQUENTIAL_CIRCULAR_QUEUE_H_INCLUDE

库函数实现

Sequential_circular_queue.cpp

/*****************************************
功  能: 基于顺序存储的环形队列(通过记录队头和元素个数)
编程人: 王涛
时  间: 2024.6.23
版  本: V2.0
******************************************/
#include <stdio.h>
#include <malloc.h>
#include "Sequential_circular_queue.h"/**************************************************
(1)函数名: Init_Sequential_circular_queue
功  能: 初始创建的顺序循环队列
参  数: (1)Sequential_circular_queue *&init_queue:要初始化的顺序队列
返回值: 无
**************************************************/void Init_Sequential_circular_queue(Sequential_circular_queue *&init_queue)
{init_queue = (Sequential_circular_queue*)malloc(sizeof(Sequential_circular_queue));init_queue->Front = 0;init_queue->element_count = 0;
}/**************************************************
(2)函数名: Destroy_Sequential_circular_queue
功  能: 销毁顺序存储的循环队列
参  数: (1)Sequential_circular_queue *&destroy_queue: 要销毁的队列
注  意: 传入的是 *& 指针地址, 所以可以修改原函数
返回值: 无(只有成功,没有失败)
**************************************************/
void Destroy_Sequential_circular_queue(Sequential_circular_queue *&destroy_queue)
{free(destroy_queue);
}/**************************************************
(3)函数名: IsEmpty_Sequential_circular_queue
功  能: 判断顺序循环队列是否为空
参  数: Sequential_circular_queue *&judge_queue:要判断的队列
返回值: bool:判断是队列是否为空
**************************************************/
bool IsEmpty_Sequential_circular_queue(Sequential_circular_queue *judge_queue)
{//队首,队尾重合,则队列为空return (judge_queue->element_count == 0);
}/**************************************************
(4)函数名: IsFull_Sequential_circular_queue
功  能: 判断队列是否队满溢出
参  数: Sequential_circular_queue *judge_queue:要进行判断的队列
返回值: bool: 是否队满? true,队满:false,不满
**************************************************/
bool IsFull_Sequential_circular_queue(Sequential_circular_queue *judge_queue)
{//满队返回truereturn (judge_queue->element_count == MaxSize);
}/**************************************************
(5)函数名: Length_Sequential_circular_queue
功  能: 测算循环队列的元素个数
参  数: Sequential_circular_queue *&measure_queue:要进行测量元素个数的队列
返回值: int: 返回队列元素个数/长度
**************************************************/
int Length_Sequential_circular_queue(Sequential_circular_queue *measure_queue)
{return (measure_queue->element_count);
}/**************************************************
(6)函数名: Enter_Sequential_circular_queue
功  能:入队元素
参  数:(1)Sequential_circular_queue *&enter_queue:入队元素的队列(2)ElemType enter_value:入队的元素值
返回值:bool: 是否队满? 是,成功:否,失败
**************************************************/
bool Enter_Sequential_circular_queue(Sequential_circular_queue *&enter_queue, ElemType enter_value)
{//进队要用到rear,我们之前没有定义,所以这里定义临时用一下int rear;//判断防止队满上溢if(IsFull_Sequential_circular_queue(enter_queue)){return false;}//不满则把尾指针算出,然后指针后移以为,插入新元素,队元素加一rear = (enter_queue->Front + enter_queue->element_count)%MaxSize;//尾指针后移rear = (rear+1)%MaxSize;//插入新元素enter_queue->data[rear] = enter_value;//队元素个数加一enter_queue->element_count++;return true;
}/**************************************************
(7)函数名: Out_Sequential_circular_queue
功  能:出队元素
参  数:(1)Sequential_circular_queue *&Out_queue:出队队列(2)ElemType &Out_value:出队队列元素值
注  意: 出队队列,要进行修改,所以是*&(指针地址)并且要传回出队元素的数值,所以也用的是 &(地址)
返回值: bool: 出队成功? 队非空,成功:队空,失败
**************************************************/
bool Out_Sequential_circular_queue(Sequential_circular_queue *&Out_queue, ElemType &Out_value)
{if(IsEmpty_Sequential_circular_queue(Out_queue))//判断为空,则跳出{return false;}//队列不空,则队首指针向后位移一位,然后传出元素,队列元素个数减去1Out_queue->Front = (Out_queue->Front + 1)%MaxSize; //锁定出队元素序号Out_value = Out_queue->data[Out_queue->Front];//传回出队数值Out_queue->element_count--; //队列个数减去1return true;    //出队成功返回true
}

主函数测试

main.cpp

#include <stdio.h>
#include "Sequential_circular_queue.h"int main()
{ElemType test_data1;Sequential_circular_queue *test_queue1;printf("(1)初始化队列test_queue1\n");Init_Sequential_circular_queue(test_queue1);printf("(2)依次进队列元素 h i j \n");if(Enter_Sequential_circular_queue(test_queue1,'h') == 0){printf("\n队满, 不能进队!\n");}if(Enter_Sequential_circular_queue(test_queue1,'i') == 0){printf("\n队满, 不能进队!\n");}if(Enter_Sequential_circular_queue(test_queue1,'j') == 0){printf("\n队满, 不能进队!\n");}printf("\n(3)队列为%s\n",(IsEmpty_Sequential_circular_queue(test_queue1)?"空":"非空"));if(Out_Sequential_circular_queue(test_queue1, test_data1) == 0){printf("队空, 不能出队\n");}else{printf("(4)出队一个元素 %c \n", test_data1);}printf("(5)队列test_queue1的元素个数:%d\n", Length_Sequential_circular_queue(test_queue1));printf("(6) 依次进队列元素 k l m\n");test_data1 = 'k';if(Enter_Sequential_circular_queue(test_queue1, test_data1) == 0){printf("\n队满,%c不能进队\n",test_data1);}test_data1 = 'l';if(Enter_Sequential_circular_queue(test_queue1, test_data1) == 0){printf("\n队满,%c不能进队\n",test_data1);}test_data1 = 'm';if(Enter_Sequential_circular_queue(test_queue1, test_data1) == 0){printf("\n队满,%c不能进队\n",test_data1);}printf("\n(7) 队列test1的元素个数是%d\n", Length_Sequential_circular_queue(test_queue1));printf("(8)出队列序号:");while(!IsEmpty_Sequential_circular_queue(test_queue1)){Out_Sequential_circular_queue(test_queue1,test_data1);printf("\n%c\n",test_data1);}printf("\n");printf("(9)释放队列\n");Destroy_Sequential_circular_queue(test_queue1);return 0;}

运行结果:


http://www.ppmy.cn/embedded/54035.html

相关文章

B端系统:配置页面如何设计,这可是用户体验的关键的关键。

提升配置页面体验的十大原则 设计B端系统的配置页面时&#xff0c;用户体验确实是非常关键的。以下是一些设计原则和建议&#xff0c;可以帮助提高配置页面的用户体验&#xff1a; 简洁明了&#xff1a;配置页面应该尽量简洁明了&#xff0c;避免过多的复杂选项和信息。使用清…

SpringBoot自动配置原理

SpringBoot自动配置原理 自动配置到底配置了些什么&#xff1f; 对于一个Spring项目&#xff0c;主要就是有两种配置&#xff1a; 一种是类似端口号&#xff0c;数据库地址&#xff0c;用户名密码等一种是各种Bean,比如整合Mybatis需要配置的MapperFactoryBean&#xff0c;比…

「C系列」C 经典练习实例

文章目录 1. 基本输入输出2. 字符串操作3. 数组与循环4. 函数与递归5. 逻辑与条件6. 数学问题7. 数字与数学8. 数组与字符串9. 逻辑与条件10. 结构体和联合体11. 指针12. 文件操作13. 动态内存分配相关链接 C语言经典练习实例及详细代码可以涵盖多个方面&#xff0c;从基础输入…

初识 GPT-4 和 ChatGPT

文章目录 LLM 概述理解 Transformer 架构及其在 LLM 中的作用解密 GPT 模型的标记化和预测步骤 想象这样⼀个世界&#xff1a;在这个世界里&#xff0c;你可以像和朋友聊天⼀样快速地与计算机交互。那会是怎样的体验&#xff1f;你可以创造出什么样的应用程序&#xff1f;这正是…

SQL面试题练习 —— 求连续段的起始位置和结束位置

目录 1 题目2 建表语句3 题解 题目来源&#xff1a;拼多多。 1 题目 有一张表t_id记录了id&#xff0c;id不重复&#xff0c;但是会存在间断&#xff0c;求出连续段的起始位置和结束位置。 样例数据 ----- | id | ----- | 1 | | 2 | | 3 | | 5 | | 6 | | 8 | | …

IPSEC VPN

IPSEC VPN IPSEC是为IP网络提供安全性的协议和服务的集合,是一种协议簇&#xff0c;一个基于网络层&#xff0c;应用密码学的安全信息协议组。一开始TCP/IP 没有考虑到信息的安全传输。IPSEC协议簇诞生的意义就是保证TCP/IP的安全传输。 伪头部校验&#xff1a;TCP再校验的时…

React 18

React Redux Router路由 TS 1 React 组件化开发方式、性能优秀&#xff08;vnode、fiber&#xff09;、丰富生态、跨平台支持&#xff08;React native支持ios、安卓&#xff09; 1.1 下载React项目 利用npx create-react-app react-basic下载项目&#xff0c;下载好项目…

深度学习之生成对抗网络StyleGAN3

StyleGAN3 是由 NVIDIA 团队提出的第三代生成对抗网络(GAN),在前代 StyleGAN 和 StyleGAN2 的基础上进行了改进,以实现更高质量的图像生成。StyleGAN3 的主要改进在于解决了 StyleGAN2 中存在的伪影(artifacts)问题,并且提升了生成图像的一致性和稳定性。 StyleGAN3 的…