【数据结构】 循环队列的基本操作 (C语言版)

目录

一、顺序队列

1、顺序队列的定义:

2、顺序队列的优缺点:

二、循环队列

1、循环队列的定义:

2、循环队列的优缺点:

三、循环队列的基本操作算法(C语言)   

1、宏定义

  2、创建结构体

3、循环队列的初始化 

4、循环队列的销毁

5、循环队列的清空

6、求循环队列的长度

7、循环队列的判空

8、求队头元素

9、循环队列入队

10、循环队列出队

11、遍历队列元素

四、循环队列的基本操作完整代码(C语言)

  五、运行结果


一、顺序队列

1、顺序队列的定义:

顺序队列是由一维数组实现的队列,其中队头元素的下标为0,队尾元素的下标为n-1(n为数组大小),队列的大小在创建时确定,且在队列的生命周期内保持不变。

2、顺序队列的优缺点:

顺序队列的优点:

  1. 空间利用率高:由于数组的大小在创建时确定,因此可以预先分配足够的空间,避免了频繁的内存申请和释放操作,提高了空间利用率。
  2. 存取速度快:由于队列元素在内存中连续存储,因此可以根据下标直接访问队头元素和队尾元素,存取速度快。

顺序队列的缺点:

  1. 不适合处理动态扩展的数据:顺序队列的空间大小在创建时确定,因此无法动态扩展,对于需要处理大规模数据的情况不太适用。
  2. 容易发生假溢出:由于顺序队列的队头和队尾元素不断向后移动,当队列满时,如果继续入队操作,会导致假溢出,即无法再进行入队操作。
  3. 无法充分利用内存的连续性优势:由于顺序队列是基于数组实现的,因此无法充分利用内存的连续性优势,因为队头和队尾元素可能分散在不同的内存位置。

二、循环队列

1、循环队列的定义:

循环队列是一种线性数据结构,它将队列的元素存储在一个连续的数组中,并通过使用循环指针来管理队列的插入和删除操作。循环队列的特点在于,当队列为空时,头尾指针指向同一位置;当队列满时,头尾指针也指向同一位置。 

2、循环队列的优缺点:

循环队列的优点:

  1. 空间利用率高:循环队列使用固定大小的数组来存储元素,无需动态分配内存,因此可以充分利用存储空间。
  2. 时间复杂度稳定:在循环队列中,插入和删除操作具有固定的时间复杂度,这使得循环队列在需要频繁进行插入和删除操作的场景中表现优异。
  3. 无需额外的空间:由于循环队列使用数组实现,因此无需额外的空间来存储元素,从而降低了空间复杂度。

循环队列的缺点:

  1. 队列大小固定:循环队列的大小是固定的,因此在处理大量数据时,可能需要预先分配大量存储空间。如果实际数据量超过预分配的空间,可能会导致数据丢失或程序崩溃。
  2. 判断队列是否为空或满的判断逻辑较复杂:在循环队列中,判断队列是否为空或满的判断逻辑相对复杂。需要同时考虑头尾指针的位置和当前队列的状态。如果处理不当,可能会导致误判或错过一些特殊情况。
  3. 插入和删除操作需要移动元素:虽然循环队列在插入和删除操作时具有固定的时间复杂度,但在实际操作中,仍然需要移动元素以保持队列的连续性和循环性。如果数据量大或者数据不均匀分布,可能会影响操作效率。

三、循环队列的基本操作算法(C语言)   

1、宏定义
#define OK 1
#define ERROR 0
#define OVERFLOW -1#define MAXSIZE 100typedef int QElemType;
typedef int Status;
  2、创建结构体
//创建结构体
typedef struct {QElemType *base;int front;int rear;
} SqQueue;
3、循环队列的初始化 
//初始化
Status InitQueue(SqQueue &Q) {//构造一个空队列Q.base = new QElemType[MAXSIZE];if (!Q.base) {exit(OVERFLOW);}Q.front = Q.rear = 0;return OK;
}
4、循环队列的销毁
//销毁队列
Status DestroyQueue(SqQueue &Q) {if (Q.base) {delete Q.base;}Q.base = NULL;Q.front = Q.rear = 0;return OK;
}
5、循环队列的清空
//清空队列
Status ClearQueue(SqQueue &Q) {Q.front = Q.rear = 0;return OK;
}
6、求循环队列的长度
//求长度
Status QueueLength(SqQueue Q) {return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;}
7、循环队列的判空
Status QueueEmpty(SqQueue Q) {if (Q.front == Q.rear) {return true;} else {return false;}
}
8、求队头元素
//求队头元素
Status GetHead(SqQueue Q, QElemType &e) {if (Q.front == Q.rear) {return ERROR;}e = Q.base[Q.front];return OK;
}
9、循环队列入队
//循环队列入队
Status EnQueue(SqQueue &Q, QElemType e) {if ((Q.rear + 1) % MAXSIZE == Q.front) return ERROR;Q.base[Q.rear] = e;Q.rear = (Q.rear + 1) % MAXSIZE;return OK;
}
10、循环队列出队
//循环队列出队
Status DeQueue(SqQueue &Q, QElemType &e) {if (Q.front == Q.rear) {return ERROR;}e = Q.base[Q.front];Q.front = (Q.front + 1) % MAXSIZE;return OK;
}
11、遍历队列元素
//遍历队列
void DisplayQueue(SqQueue Q) {int i = Q.front;printf("队列元素为: ");while (Q.front != Q.rear && (i + MAXSIZE) % MAXSIZE != Q.rear) {printf("%d ", Q.base[i]);i++;}
}
四、循环队列的基本操作完整代码(C语言)
#include <stdio.h>
#include <stdlib.h>#define OK 1
#define ERROR 0
#define OVERFLOW -1#define MAXSIZE 100typedef int QElemType;
typedef int Status;//创建结构体
typedef struct {QElemType *base;int front;int rear;
} SqQueue;//初始化
Status InitQueue(SqQueue &Q) {//构造一个空队列Q.base = new QElemType[MAXSIZE];if (!Q.base) {exit(OVERFLOW);}Q.front = Q.rear = 0;return OK;
}//销毁队列
Status DestroyQueue(SqQueue &Q) {if (Q.base) {delete Q.base;}Q.base = NULL;Q.front = Q.rear = 0;return OK;
}//清空队列
Status ClearQueue(SqQueue &Q) {Q.front = Q.rear = 0;return OK;
}//求长度
Status QueueLength(SqQueue Q) {return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;}//判空
Status QueueEmpty(SqQueue Q) {if (Q.front == Q.rear) {return true;} else {return false;}
}//求队头元素
Status GetHead(SqQueue Q, QElemType &e) {if (Q.front == Q.rear) {return ERROR;}e = Q.base[Q.front];return OK;
}//循环队列入队
Status EnQueue(SqQueue &Q, QElemType e) {if ((Q.rear + 1) % MAXSIZE == Q.front) return ERROR;Q.base[Q.rear] = e;Q.rear = (Q.rear + 1) % MAXSIZE;return OK;
}//循环队列出队
Status DeQueue(SqQueue &Q, QElemType &e) {if (Q.front == Q.rear) {return ERROR;}e = Q.base[Q.front];Q.front = (Q.front + 1) % MAXSIZE;return OK;
}//遍历队列
void DisplayQueue(SqQueue Q) {int i = Q.front;printf("队列元素为: ");while (Q.front != Q.rear && (i + MAXSIZE) % MAXSIZE != Q.rear) {printf("%d ", Q.base[i]);i++;}
}//功能菜单列表
void show_help() {printf("******* 功能菜单列表 *******\n");printf("1----入队------------------\n");printf("2----求循环队列长度----------\n");printf("3----出队------------------\n");printf("4----取队头元素-------------\n");printf("5----清空循环队列-----------\n");printf("6----销毁循环队列-----------\n");printf("7----判断循环队列是否为空-----\n");printf("8----批量插入元素------------\n");printf("9----显示队列元素------------\n");printf("10----退出------------------\n\n");
}int main() {SqQueue sq;//初始化Status rInitStack = InitQueue(sq);if (rInitStack == OK) {printf("循环队列初始化成功!\n");} else {printf("循环队列初始化失败!\n");}while (1) {//功能菜单列表show_help();int flag;printf("请输入所需的功能编号:\n");scanf("%d", &flag);switch (flag) {case 1: {//入队Status EnQueueindex;printf("请输入插入元素(请在英文状态下输入例如:1): \n");scanf("%d", &EnQueueindex);Status rEnQueue = EnQueue(sq, EnQueueindex);if (rEnQueue == OK) {printf("向循环队列入队%d成功!\n", EnQueueindex);} else {printf("向循环队列入队失败!\n");}}break;case 2: {//求循环队列的长度int length = QueueLength(sq);printf("循环队列的长度为:%d。 \n\n", length);}break;case 3: {//出队Status DeQueueindex;Status rDeQueue = DeQueue(sq, DeQueueindex);if (rDeQueue == OK) {printf("向循环队列出队%d成功!\n", DeQueueindex);} else {printf("向循环队列出队失败!\n");}}break;case 4: {//求队头元素Status topData;Status rGetHead = GetHead(sq, topData);if (rGetHead == OK) {printf("向循环队列获取队头元素:%d\n", topData);} else {printf("向循环队列获取队头元素失败!\n");}}break;case 5: { //清空Status rClearStack = ClearQueue(sq);if (rClearStack == OK) {printf("循环队列清空成功!\n");} else {printf("循环队列清空失败!\n");}}break;case 6: {//销毁Status rDestroyStack = DestroyQueue(sq);if (rDestroyStack == OK) {printf("循环队列销毁成功!\n");} else {printf("循环队列销毁失败!\n");}}break;case 7: {///判空Status ClearStatus = QueueEmpty(sq);if (ClearStatus == true) {printf("循环队列为空!\n\n");} else {printf("循环队列不为空!\n\n");}}break;case 8: {//批量插入int on;printf("请输入想要插入的元素个数:\n");scanf("%d", &on);QElemType array[on];for (int i = 1; i <= on; i++) {printf("向循环队列第%d个位置插入元素为:", i);scanf("%d", &array[i]);}for (int i = 1; i <= on; i++) {Status InsertStatus = EnQueue(sq, array[i]);if (InsertStatus == OK) {printf("向循环队列第%d个位置插入元素%d成功!\n", i, array[i]);} else {printf("向循环队列第%d个位置插入元素%d失败!\n", i, array[i]);}}}break;case 9: {//输出链表元素DisplayQueue(sq);printf("\n");}break;case 10: {//退出程序return 0;}break;default: {printf("输入错误,无此功能,请检查输入:\n\n");}}}return 1;
}

  五、运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/645245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨平台同步 Shell 历史记录,无缝切换会话 | 开源日报 No.154

atuinsh/atuin Stars: 14.3k License: MIT Atuin 是一个用 SQLite 数据库替换现有 shell 历史记录的工具&#xff0c;可以记录命令的额外上下文&#xff0c;并提供可选且完全加密的历史同步功能。其主要功能和核心优势包括&#xff1a; 重新绑定 ctrl-r 和 up (可配置) 到全屏…

书生·浦语大模型--第五节课笔记作业--LMDeploy 大模型量化部署实践

文章目录 大模型部署背景LMDeploy简介动手实践创建环境服务部署在线转换离线转换TurboMind推理API服务Gradio 作为前端 Demo演示TurboMind 服务作为后端TurboMind 推理作为后端 作业 大模型部署背景 部署&#xff1a;将训练好的模型在特定软硬件环境中启动的过程 挑战&#x…

Leetcode—2788. 按分隔符拆分字符串【简单】(stringstream的应用)

2023每日刷题&#xff08;八十六&#xff09; Leetcode—2788. 按分隔符拆分字符串 实现代码 class Solution { public:vector<string> splitWordsBySeparator(vector<string>& words, char separator) {vector<string> res;for(auto word: words) {st…

关于标准那些事——第十篇 分类标准

最近要赶一个极其重要的CANS认证项目&#xff0c;这会是全中国第一个完全数字化CNAS认证的实验室项目&#xff0c;内容分享进度会比较慢。其实&#xff0c;大多数情况也并不是没有时间&#xff0c;俗话说&#xff1a;时间嘛&#xff0c;挤挤总是有的&#xff01;其实影响进度更…

imgaug库图像增强指南(38):从入门到精通——图像卷积的全面解析

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

excel统计分析——Tukey‘s-b法多重比较

参考资料&#xff1a;生物统计学 Tukeys-b多重比较法是对Tukey法和S-N-K法的综合&#xff0c;取两种方法临界值的各1/2合成。临界值表达式为&#xff1a; 其中&#xff0c;m为秩次距&#xff0c;k为样本平均数的个数&#xff0c;df为误差项自由度&#xff0c; Tukey多重比较具…

【IEEE会议征稿通知】2024年算法、软件工程与网络安全国际学术会议(ASENS 2024)

2024年算法、软件工程与网络安全国际学术会议&#xff08;ASENS 2024&#xff09; The International Conference on Algorithms, Software Engineering and Network Security 2024年算法、软件工程与网络安全国际学术会议&#xff08;ASENS 2024&#xff09;将于2024年3月29…

通过CanvasRenderer.SetColor和Image.color修改UI组件颜色的区别

1&#xff09;通过CanvasRenderer.SetColor和Image.color修改UI组件颜色的区别 2&#xff09;OPPO相关机型没法在Unity启用90或120FPS 3&#xff09;手机输入法中的emoji 4&#xff09;Unity Application Patching怎么用 这是第369篇UWA技术知识分享的推送&#xff0c;精选了UW…

工程项目管理软件系统

工程项目管理软件系统单机版永久免费使用&#xff0c;无录入数量限制&#xff0c;无打印限制&#xff0c;无时间限制 1、产品概述 专业项目管理软件,业务流程清晰&#xff0c;操作简单&#xff0c;软件速度快; 围绕项目的(任务、进度、出库、入库、借用、人工、合同等)进行管理…

牛客NC267071小红构造数组(C++)

题目链接 实现方法 本题分为两步&#xff1a; 质因数分解&#xff1b;数字重排序&#xff08;相同数字不连续&#xff09; 质因数分解使用线性筛法&#xff0c;并在求质因数的过程中不断减小原数字。 数字重排序与重排字符串方法相同。 使用有序集合multiset存放各质因数及…

简述Elasticsearch(ES)是什么 全文搜索概念 (倒排索引 管理文档)

今天 我们来说说 NoSql 中的 Elasticsearch 大家基本都叫它 ES 官方介绍 它是一个分布式全文搜索引擎 分布式是一个系统架构的概念 而 全文搜索引擎 全文搜索 可以说基本大家天天都在接触 就比如 我们京东购物 想买什么东西 在全文输入框中搜索 它就会在所有物品中 帮你找出需…

C语言零基础入门第2天《 visual studio下载安装教程和搭建开发环境及踩坑指南》(保姆级图文教程)

visual studio下载安装教程和搭建开发环境 1、 项目实战效果图2、简单了解一下目前主流的开发环境3、 visual studio下载地址4、 visual studio安装教程5、 配置visual studio环境变量 6、如何新建一个C项目7、新建第一个C程序8、用代码测试创建的项目是否可用8、如何成功让代码…

利用git上传本地文件

1、建立仓库 2.然后刷新网站&#xff0c;获取下载链接&#xff0c;备用。 3、接下来在本地创建一个文件夹&#xff0c; 4、把github上面的仓库克隆到本地 git clone https://github.com/xxxxx&#xff08;https://github.com/xxxxx替换成你之前复制的地址&#xff09; 5、把…

GPT4+Python近红外光谱数据分析及机器学习与深度学习建模

详情点击链接&#xff1a;GPT4Python近红外光谱数据分析及机器学习与深度学习建模 第一&#xff1a;GPT4 1、ChatGPT&#xff08;GPT-1、GPT-2、GPT-3、GPT-3.5、GPT-4模型的演变&#xff09; 2、ChatGPT对话初体验 3、GPT-4与GPT-3.5的区别&#xff0c;以及与国内大语言模…

postman使用-09发送报告

文章目录 环境部署生成测试报告导出测试集导出环境变量导出全局变量 生成报告演示案例一&#xff1a;单一接口使用环境变量和全局变量案例二&#xff1a;单一接口使用环境变量、全局变量、CSV文件参数案例三&#xff1a;多接口&#xff0c;批量执行 总结 环境部署 1.安装nodej…

CSS文本外观属性(知识点2)

知识引入 1.text-indent&#xff1a;首行缩进 text-indent属性是用于定义首行文本的缩进&#xff0c;其属性值可为不同单位的数值&#xff0c;em字符宽度的倍数或相对于浏览器窗口宽度的百分比%&#xff0c;允许使用负值&#xff0c;建议使用em作为设置单位&#xff0c;下面通…

Docker Image(镜像)

Docker镜像是什么 Docker image 本质上是一个 read-only 只读文件&#xff0c;这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。我们可以把 Docker image 理解成一个模板&#xff0c; 可以通过这个模板实例化出来很多容器。image 里面…

智能家居20年,从「动手」到「用脑」

【潮汐商业评论/原创】 正在装修新家的Carro最近陷入了纠结之中&#xff0c;“还没想好要怎么装一套完整的智能家居&#xff0c;家里的基装就已经开始了。” 事实上&#xff0c;Carro对智能家居也不了解&#xff0c;并不知道该如何下手&#xff0c;心想“要是能一次性设计好就…

MyBatis详解(1)-- ORM模型

MyBatis详解&#xff08;1&#xff09; JDBC的弊端&#xff1a; ORM 模型常见的ORM模型&#xff1a;mybatis和Hibernate的区别 ***优势&#xff1a;mybatis解决问题&#xff1a;优点&#xff1a; MyBatisMyBatis环境搭建项目架构mybatis生命周期 JDBC的弊端&#xff1a; 1.硬编…

jenkins部署过程记录

一、jenkins部署git链接找不到 原因分析&#xff1a; 机器的git环境不是个人git的权限&#xff0c;所以clone不了。Jenkins的master节点部署机器已经部署较多其他的job在跑&#xff0c;如果直接修改机器的git配置&#xff0c;很可能影响到其他的job clone 不了代码&#xff0c…