队列---循环队列实现
循环队列详解
概述
循环队列是一种基于数组实现的队列数据结构,其中队列的队首和队尾是通过模运算连接起来形成一个逻辑上的环形结构。这样可以有效地利用数组的空间,避免出现“假溢出”的情况。
结构体定义
循环队列的结构体定义如下:
typedef struct CycleQueue {int data[MaxSize]; // 用于存储队列中元素的数组int front; // 队首指针,指向队首元素的前一位int rear; // 队尾指针,指向队尾元素的位置
} CycleQueue;
基本操作
初始化队列
初始化队列时,为结构体分配内存,并设置队首和队尾指针为 0
,表示队列为空:
void InitQueue(CycleQueue *&q) {q = (CycleQueue *) malloc (sizeof(CycleQueue));q->front = q->rear = 0;
}
销毁队列
销毁队列时,释放之前分配的内存空间:
void DestroyQueue(CycleQueue *&q) {free(q);
}
判断队列是否为空
通过检查队首和队尾指针是否相等来判断队列是否为空:
bool QueueEmpty(CycleQueue *&q) {if (q->rear == q->front) {return true;} else {return false;}
}
入队操作
向队列中添加新元素。如果队尾指针的下一位与队首指针相同,则返回 false
表示失败;否则将元素存入队尾,并更新队尾指针:
bool enQueue(CycleQueue *&q, int e) {if ((q->rear + 1) % MaxSize == q->front) {return false;}q->data[q->rear] = e;q->rear = (q->rear + 1) % MaxSize;return true;
}
出队操作
从队列中移除队首元素。如果队首和队尾指针相等,则返回 false
表示失败;否则返回队首元素,并更新队首指针:
bool deQueue(CycleQueue *&q, int e) {if (q->front == q->rear) {return false;}e = q->data[q->front];q->front = (q->front + 1) % MaxSize;return true;
}
打印队列的内容
打印队列中所有元素。如果队列为空,则输出提示信息:
void displayQueue(CycleQueue *q) {if (QueueEmpty(q)) {printf("循环队列中没有元素\n");} else {int i = q->front;do {printf("%d ", q->data[i]);i = (i + 1) % MaxSize; // 循环到数组的开头} while (i != q->rear); // 终止条件printf("\n");}
}
示例代码解析
以下是一个简单的程序示例,演示了如何使用上述定义的循环队列进行基本操作:
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 10// 定义队列结构体
typedef struct CycleQueue {int data[MaxSize];int front;int rear;
} CycleQueue;// 初始化队列
void InitQueue(CycleQueue *&q) {q = (CycleQueue *) malloc (sizeof(CycleQueue));q->front = q->rear = 0;
}// 销毁队列
void DestroyQueue(CycleQueue *&q) {free(q);
}// 判断队列是否为空
bool QueueEmpty(CycleQueue *&q) {if (q->rear == q->front) {return true;} else {return false;}
}// 入队
bool enQueue(CycleQueue *&q, int e) {if ((q->rear + 1) % MaxSize == q->front) {return false;}q->data[q->rear] = e;q->rear = (q->rear + 1) % MaxSize;return true;
}// 出队
bool deQueue(CycleQueue *&q, int e) {if (q->front == q->rear) {return false;}e = q->data[q->front];q->front = (q->front + 1) % MaxSize;return true;
}// 打印输出顺序队列
void displayQueue(CycleQueue *q) {if (QueueEmpty(q)) {printf("循环队列中没有元素\n");} else {int i = q->front;do {printf("%d ", q->data[i]);i = (i + 1) % MaxSize; // 循环到数组的开头} while (i != q->rear); // 终止条件printf("\n");}
}int main() {CycleQueue *q;InitQueue(q);bool enFlag = true;while (enFlag) {printf("请输入需要入队的数据:");int e;scanf("%d", &e);enFlag = enQueue(q, e);displayQueue(q);if (enFlag) {printf("入队成功\n");} else {printf("入队失败\n");}int q;printf("是否继续入队?(0/1):");scanf("%d", &q);enFlag = q == 1 ? true : false;}printf("入队结束\n");int top;printf("是否需要出队?(0/1)\n");int deFlag;scanf("%d", &deFlag);while (deFlag) {int e;deFlag = deQueue(q, e) ? 1 : 0;printf("出队的元素为:%d\n", e);displayQueue(q);printf("入队成功\n"); // 这里应该是 "出队成功"printf("是否继续出队?(0/1)\n");if (deFlag) {scanf("%d", &deFlag);}}printf("出队结束\n");printf("销毁队\n");DestroyQueue(q);return 0;
}
注意事项
- 内存管理:确保正确释放分配给队列的内存,避免内存泄漏。
- 边界条件处理:检查队列满或空的情况,避免越界访问。
- 输入验证:对于用户输入进行适当的验证,确保程序的健壮性。
相关文章:
队列---循环队列实现
循环队列详解 概述 循环队列是一种基于数组实现的队列数据结构,其中队列的队首和队尾是通过模运算连接起来形成一个逻辑上的环形结构。这样可以有效地利用数组的空间,避免出现“假溢出”的情况。 结构体定义 循环队列的结构体定义如下: …...

【视频讲解】后端增删改查接口有什么用?
B站视频地址 B站视频地址 前言 “后端增删改查接口有什么用”,其实这句话可以拆解为下面3个问题。 接口是什么意思?后端接口是什么意思?后端接口中的增删改查接口有什么用? 1、接口 概念:接口的概念在不同的领域中…...
双指针hard题
[LeetCode]4. Median of Two Sorted Arrays 中文 - YouTube 依赖merge sort和priorityqueue的废物 正式变身山景城一姐小迷妹✪ω✪ 寻找正序数组中位数 class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int len1 nums1.length;int len2 …...

前端实现【 批量任务调度管理器 】demo优化
一、前提介绍 我在前文实现过一个【批量任务调度管理器】的 demo,能实现简单的任务批量并发分组,过滤等操作。但是还有很多优化空间,所以查找一些优化的库, 主要想优化两个方面, 上篇提到的: 针对 3&…...

【数据结构】包装类和泛型
🎉欢迎大家收看,请多多支持🌹 🥰关注小哇,和我一起成长🚀个人主页🚀 ⭐在更专栏Java ⭐数据结构 ⭐已更专栏有C语言、计算机网络⭐ 👑目录 包装类🌙 ⭐基本类型对应的包…...
浅学爬虫-数据存储
在数据爬取完成后,我们需要将数据存储起来,以便于后续的分析和处理。常见的数据存储方式包括存储到CSV文件和存储到数据库。下面我们详细介绍如何实现这些存储方式。 存储到CSV CSV(Comma-Separated Values)文件是一种常用的文本…...

十六、maven git-快速上手(智慧云教育平台)
🌻🌻 目录 一、概述及项目管理工具介绍1.1 项目介绍1.2 maven 介绍及其配置1.2.1 maven 介绍1.2.2 maven 下载与配置 1.3 pom 中常见标签的使用1.4 后端项目环境的搭建1.5 Git 简介1.6 Git 的基本使用1.6.1 码云的注册与仓库创建1.6.2 上传代码到码云仓库…...

chrome/edge浏览器插件开发入门与加载使用
同学们可以私信我加入学习群! 正文开始 前言一、插件与普通前端项目二、开发插件——manifest.json三、插件使用edge浏览器中使用/加载插件chrome浏览器中使用/加载插件 总结 前言 chrome插件的出现,初衷可能是为了方便用户更好地控制浏览器,…...

【完美解决】 TypeError: ‘str’ object does not support item assignment
【完美解决】 TypeError: ‘str’ object does not support item assignment 在Python编程中,遇到TypeError: str object does not support item assignment这样的错误通常意味着你试图修改字符串中的某个字符,但字符串是不可变类型,不支持这…...
Android SurfaceFlinger——渲染开始帧(四十三)
通过前面的文章我们介绍了 SurfaceFlinger 图层合成的整体流程,已经对应步骤的前五步,这里我们开始介绍帧渲染流程的第一步——开始帧。 1.更新输出设备的色彩配置文件2.更新与合成相关的状态3.计划合成帧图层4.写入合成状态5.设置颜色矩阵6.开始帧7.准备帧数据以进行显示(异…...
fastadmin搜索栏实现某字段动态下拉搜索
记录:fastadmin搜索栏实现某字段动态下拉搜索 方式一:使用selectpicker组件,可多选 { field: travel_agency, title:__(Travel_agency),addClass:"selectpicker", operate:"IN",data:"multiple", searchList:…...
.NET未来路在何方?
简述 在软件开发的漫长旅程中,将代码打包成可执行的EXE文件是一项必不可少的技能。它不仅能够保护源代码,还能为用户提供便捷的安装体验。但手动打包过程繁琐且容易出错,自动化打包成为了开发者的福音。 在软件开发的浩瀚星空中,.…...

Vue开发环境搭建
文章目录 引言I 安装NVM1.1 Windows系统安装NVM,实现Node.js多版本管理1.2 配置下载镜像1.3 NVM常用操作命令II VUE项目的基础配置2.1 制定不同的环境配置2.2 正式环境隐藏日志2.3 vscode常用插件引言 开发工具: node.js 、npm 开发编辑器:vscode 开发框架:VUE I 安装NVM…...

【数据结构初阶】详解:实现循环队列、用栈实现队列、用队列实现栈
文章目录 一、循环队列1、题目简述2、方法讲解2.1、了解tail的指向2.2、了解空间是如何利用的2.3、如何判断队列是否为空(假溢出问题)?2.4、实现代码 二、用栈实现队列1、题目简述2、方法讲解2.1、讲解2.2、实现代码 三、用队列实现栈1、题目…...

【Hot100】LeetCode—31. 下一个排列
目录 题目1- 思路2- 实现⭐31. 下一个排列——题解思路 3- ACM 实现 题目 原题连接:31. 下一个排列 1- 思路 技巧题,分为以下几个步骤 ① 寻找拐点: i 1 :出现 nums[i1] > nums[i] ,则 i 1 就是拐点 从右向左遍…...

找到学习的引擎,更让你进入心流状态的高效学习
一、心流状态的启动秘籍 1. 简单开始:找到学习的入口 从简单的任务开始,比如整理学习空间或列出学习计划,让大脑逐渐适应学习的节奏。 2. 环境塑造:打造专注的学习空间 清理桌面,减少干扰,比如将手机置…...
QItemDelegate QItemDelegate QItemDelegate
qtreeview点击某一行有颜色显示 c 在Qt中,要实现QTreeView点击某行有颜色显示,可以通过设置QTreeView的itemDelegate来自定义显示样式。以下是一个简单的例子,演示如何为QTreeView的项设置点击时的背景颜色。 #include <QApplication>…...

MySQL数据库 外键默认约束和action 基础知识【2】推荐
数据库就是储存和管理数据的仓库,对数据进行增删改查操作,其本质是一个软件。MySQL就是一种开源的关系型数库,也是最受欢迎的数据库之一,今天对MySQL数据的基础知识做了整理,方便自己查看,也欢迎正在学习My…...
JS正则表达式学习与实践
JS正则表达式学习笔记 1 学习笔记1.1 字符类1.2 量词和分支1.3 标志1.4 锚点1.5 断言 2 常用正则2.1 检查微信浏览器2.2 检查移动端浏览器2.3 检查中文字符2.4 手机号严格2.5 手机号比较宽松2.6 手机号宽松2.7 邮箱验证2.8 金额格式2.9 身份证号2.10 至少8为有数字、大小写字符…...

Java数据结构(五)——栈和队列
文章目录 栈和队列栈基本概念栈的模拟实现集合框架中的栈栈的创建栈的方法栈的遍历 栈的应用及相关练习括号匹配逆波兰表达式求值出栈入栈次序匹配最小栈 几个含"栈"概念的区分 队列基本概念队列的模拟实现循环队列双端队列集合框架中的队列队列的创建队列的方法队列…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...