数据结构--队列与循环队列
队列
队列是什么,先联想一下队,排队先来的人排前面先出,后来的人排后面后出;队列的性质也一样,先进队列的数据先出,后进队列的后出;就像图一的样子:
图1
如图1,1号元素是最先进的,开始出队时,那么他就是最先出的,然后12进队,就应该排在最后面,等待前面的所有元素出队完成后才能出队;有个专业的名词叫FIFO(first in first out),翻译过来就是先进先出的意思;
队列的数据结构:
数据结构 = 结构定义 + 结构操作;
队列的结构定义就是:
物理结构:
一个存储数据的数据域,这里我们用的是数组;一个头指针,一个尾指针;头指针指向,下个出队的元素的位置,尾指针指向最后一个元素的位置,然后还有队列的长度,元素个数;
那么用结构体封装他的物理结构代码如下:
typedef struct Queue {int size, cnt, head, tail;//4个变量分别是,队列长度,元素个数,头指针,尾指针//因为用的是数组,所以头尾指针,直接用一个int变量就可以存贮了void *data;//数据域 } Queue;逻辑结构:
他的逻辑结构就是,先进先出,需要去维护这个性质,如果破坏了性质就不能算做数据结构了,因为你破坏了它的结构定义;所以一定不要破坏数据结构的结构定义;
结构操作:
说完了结构定义来看下,队列它是如何出队入队的:
现在出队一个元素,那么Head指针就应该指向下一个位置,也就是位置1,那么head++,head = 1:
现在入队一个元素,假如入队元素12,那么Tail指针应该先Tail++,在放入新元素,不然就覆盖掉了元素11,如下图:
可能有人会问,1不是出队了嘛,为什么在图中还有,是我画图没有画完,但是,在写代码的时候,情况就是这样的,因为这是一个数组,你只是吧头指针往后偏移了,但是那个位置的元素他还是存在的,只是不会去访问到了,那么他也相当于出队了;也就是相当于我们在数组上面维护了一个队列,他从头部减少,尾部增加的一个思想;
循环队列
提到队列了,也不得不提循环队列,循环队列是什么,假如长度为10的队列,它入队了10个元素,也出队了10个元素,那么头尾指针现在是在同一个位置,就是下图情况:
他现在里面是没有元素的,你现在看到的1-9是已经出队了的,10是还没有出队的,那么怎么办,那就直接让tail = 0,又从数组的头部开始 ,如图
元素11入队,直接覆盖掉之前的元素1,那么下次入队就是从位置1开始,出队还是元素10先出队,然后出队后,Head指针那么也应该等于0,也从数组的头开始再次出队;
那么如何去判断队列为空呢,在定义物理结构是吗,有一个变量记录着,队列当前的元素个数;
代码实现:
那么思路大概讲完了,代码实现的是循环队列,来看代码实现:
#include <stdio.h> #include <stdlib.h> #include <time.h>typedef struct Queue {int size, cnt, head, tail;//4个变量分别是,队列长度,元素个数,头指针,尾指针//因为用的是数组,所以头尾指针,直接用一个int变量就可以存贮了int *data;//数据域 } Queue;Queue *init(int n) {//初始化队列,向计算机借空间Queue *q = (Queue *)malloc(sizeof(Queue));q->data = (int *)malloc(sizeof(int) * n);q->size = n;q->cnt = q->head = q->tail = 0;return q; } int empty(Queue *); int front(Queue *q) {//获取队列头部元素if(empty(q)) return -1;return q->data[q->head]; }int empty(Queue *q) {//判读队列是否为空return q->cnt == 0; }int push(Queue *q, int val) {//入队if (q->cnt == q->size) return 0;q->data[q->tail++] = val;if (q->tail == q->size) q->tail = 0;q->cnt++;return 1; }int pop(Queue *q) {//出队if (empty(q)) return 0;q->head++;q->cnt--;if (q->head == q->size) q->head = 0;return 1; } void clear(Queue *q) {//有借有还if (!q) return ;free(q->data);free(q);return ; }void output(Queue *q) {//打印队列中的元素printf("Queue(%d) :[", q->cnt);for (int i = q->head, j = 0; j < q->cnt; j++) {j && printf(" ");printf("%d", q->data[(i + j) % q->size]);}printf("]\n");return ; }int main() {//测试srand(time(0));int op, val;Queue *q = init(5);for (int i = 0; i < 20; i++) {op = rand() % 4; val = rand() % 100;switch (op) {case 0:case 1:case 2: {printf("%d push in Queue is %d\n", val, push(q, val));} break;case 3: {printf("%d ", front(q));printf("pop Queue is %d\n", pop(q));} break;}output(q);}clear(q);return 0; }
相关文章:
数据结构--队列与循环队列
队列 队列是什么,先联想一下队,排队先来的人排前面先出,后来的人排后面后出;队列的性质也一样,先进队列的数据先出,后进队列的后出;就像图一的样子: 图1 如图1,1号元素是…...
八路参考文献:[八一新书]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022.
八路参考文献:[八一新书]许少辉.乡村振兴战略下传统村落文化旅游设计[M]北京:中国建筑工业出版社,2022....
版本控制 Git工具的使用
版本控制的概念: 版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。简单来说就是用于管理多人协同开发…...
GNS3 在 Linux 上的安装指南
文章目录 GNS3 在 Linux 上的安装指南1. 基于 Ubuntu 的发行版安装 GNS32. 基于 Debian 的安装3. 基于 ArchLinux 的安装4. 从 Pypi 安装 GNS35. 启动 GNS3 服务端GNS3 在 Linux 上的安装指南 大家好,今天我们来聊聊如何在 Linux 上安装 GNS3。GNS3 是一个非常受欢迎的网络模…...
Mybatis中 list.size() = 1 但显示 All elements are null
一、Bug展示 二、原因分析 2.1.情形一:Mybatis的XML中返回类型映射错误 <select id"selectByDesc" parameterType"com.task.bean.OrderInfo"resultType"com.task.bean.OrderInfo">select MER_ID,SETTLE_DATE,ICE_NAME,ORDER_S…...
Soul的社交元宇宙之路,还有多远?
在元宇宙概念爆火的当下,以互联网为依托的虚拟社交逐步为用户承载起其空缺的精神交流与寄托,而在这其中,以“跟随灵魂找到你”为Slogan,主打年轻人社交元宇宙平台的APP--Soul则在这条赛道上凭借着独特的风格,逐步突出重…...
如何解决Memcached缓存击穿和雪崩问题
原文 Memcached是一种快速、高性能的分布式内存对象缓存系统,广泛应用于Web应用的缓存中。然而,Memcached也存在一些常见的问题,如缓存击穿和缓存雪崩。本文将介绍什么是缓存击穿和缓存雪崩,并提供一些解决这些问题的方法&#x…...
uniapp 开发之仿抖音,上下滑动切换视频、点击小爱心效果
效果图: 功能描述: 上下滑动视频,双击暂停,然后第一个视频再往上滑显示”已经滑到顶了“ 开始代码: 首先视频接口使用的公开的视频测试接口 开放API-2.0 官网展示 Swagger UI 接口文档 一…...
【C++设计模式】依赖倒转原则
2023年8月30日,周三上午 目录 概述含义举个简单的例子传统做法使用依赖倒转原则代码说明再举一个具体的例子以生活为例 概述 依赖倒转原则(Dependency Inversion Principle,DIP)是面向对象设计中的一个基本原则。 含义 高层模块不应该依赖低层模块,两者都应该依…...
浙江首例!金华银行基于完全国产自研数据库构建新一代核心系统
6 月 12 日,金华银行举行“星辉工程”核心项目群上线发布会,新一代核心系统部署在国产分布式数据库 OceanBase 上,实现系统的高可用、高性能、国产升级。据悉,这是浙江省首例基于完全国产自研数据库落地的银行核心系统。 金华银行…...
ASP.NET Core 中的 静态文件
Static Files Static Files 包括 HTML,CSS,图片,JavaScript,以及其他静态资源文件。 即网站本身的内容。 Static Files 服务 Static Files 保存在项目的 Web Root 目录,即 wwwroot 文件夹中。 而wwwroot目录是Conte…...
2023年天府杯——C 题:码头停靠问题
问题背景: 某个港口有多个不同类型的码头,可以停靠不同种类的船只。每 艘船只需要一定的时间来完成装卸货物等任务,并且每个码头有容量 限制和停靠时间限制。港口需要在保证收益的情况下,尽可能地提高 运营效率和降低成本。同…...
集丰照明|汽车美容店设计,装修色彩灯光搭配方法
正确处理好店面的空间设计。 店铺各个功能区设计要合理,衔接合理,这样既能提高员工的工作效率也能提高顾客的满意度。合理安排店铺的空间分配, 要给顾客一种舒适度,既不能让顾客感觉到过于拥挤,又不能浪费店铺的有限空…...
性能提升3-4倍!贝壳基于Flink + OceanBase的实时维表服务
作者介绍:肖赞,贝壳找房(北京)科技有限公司 OLAP 平台负责人,基础研发线大数据平台部架构师。 贝壳找房是中国最大的居住服务平台。作为居住产业数字化服务平台,贝壳致力于推进居住服务的产业数字化、智能…...
取数组中每个元素的最高位
1 题目 /*程序将一维数组a中N个元素的最高位取出,保存在一维数组b的对应位置。 程序运行结果为: a:82 756 71629 5 2034 b: 8 7 7 5 2 */ 2 思考 简单来说就是取一个数据的最高位。 一开始的笨方法没有办法判断数据的长度,后来…...
Docker一键部署Nacos
官方参考文档: https://nacos.io/zh-cn/docs/quick-start-docker.html 本人实践 一、创建数据库&数据表 使用sql脚本创建:https://github.com/alibaba/nacos/blob/master/config/src/main/resources/META-INF/nacos-db.sql 二、新建文件夹并赋权…...
【数学建模】-- 模糊综合评价
模糊综合评价(Fuzzy Comprehensive Evaluation)是一种用于处理不确定性和模糊性信息的决策分析方法。它通常用于解决复杂的多指标决策问题,其中各指标之间可能存在交叉影响和模糊性的情况。模糊综合评价通过将不确定性和模糊性量化࿰…...
Java 数据库改了一个字段, 前端传值后端接收为null问题解决
前端传值后端为null的原因可能有很多种,我遇到一个问题是,数据库修改了一个字段,前端传值了,但是后台一直接收为null值, 原因排查: 1、字段没有匹配上,数据库字段和前端字段传值不一致 2、大…...
lnmp架构-mysql1
1.MySQL数据库编译 make完之后是这样的 mysql 初始化 所有这种默认不在系统环境中的路径里 就这样加 这样就可以直接调用 不用输入路径调用 2.初始化 重置密码 3.mysql主从复制 配置master 配置slave 当master 端中还没有插入数据时 在server2 上配slave 此时master 还没进…...
Threadlocal在项目中的应用
ThreadLocal为每一线程提供一份单独的存储空间,具有线程隔离的作用 PageHelper.startPage()方法使用ThreadLocal来保存分页参数,保证线程安全性。PageHelper通过集成MyBatis的拦截器机制来实现对SQL语句的拦截和修改 项目中使用了ThreadLocal保存每个线程…...
告别手动框选!用SUSTechPOINTS的V键批量标注,5分钟搞定一帧点云
解锁SUSTechPOINTS的V键批量标注:点云处理效率革命 在自动驾驶与机器人研发领域,点云标注是构建高精度感知模型的基础环节,但传统逐帧手动标注方式往往成为项目进度的瓶颈。我曾参与过一个城市级点云数据集标注项目,团队最初采用常…...
构建个人代码仓库:提升开发效率的实践指南
1. 项目概述:一个面向21世纪开发者的代码仓库最近在GitHub上看到一个挺有意思的项目,叫“21st-dev/1code”。光看这个名字,你可能觉得有点抽象,但点进去之后,我发现它其实是一个挺有想法的代码仓库。这个项目没有复杂的…...
揭秘GPT超级提示工程:从原理到实战,打造高效AI协作指南
1. 项目概述:当“Awesome”遇见“Super Prompting”最近在GitHub上闲逛,发现了一个挺有意思的仓库,叫“CyberAlbSecOP/Awesome_GPT_Super_Prompting”。光看这名字,就透着一股“硬核”和“集大成”的味道。作为一个长期和各类大语…...
AI智能体GUI交互实战:从原理到实现,让AI玩转桌面应用
1. 项目概述:一个能“玩”游戏的AI智能体最近在AI智能体(Agent)的圈子里,一个名为“ChattyPlay-Agent”的开源项目引起了我的注意。乍一看名字,你可能会觉得它又是一个基于大语言模型(LLM)的聊天…...
ITK-SNAP医学图像分割:破解三维解剖结构提取的工程难题
ITK-SNAP医学图像分割:破解三维解剖结构提取的工程难题 【免费下载链接】itksnap ITK-SNAP medical image segmentation tool 项目地址: https://gitcode.com/gh_mirrors/it/itksnap 当我们面对复杂的脑部MRI数据、肿瘤CT扫描或心血管影像时,最大…...
三维重建下半场,拼的全是底层基建实力!
三维重建已从算法创新竞赛正式迈入基础设施比拼新阶段,主流技术路线逐步收敛,单纯算法红利见顶,行业竞争核心转向数据、算力、平台、生态等底层综合能力。当下竞争不再只比模型效果,而是聚焦四大核心基建维度:采集传感…...
RTKLIB 2.4.3项目在Visual Studio 2019中的工程化配置:告别零散文件,打造清晰结构
RTKLIB 2.4.3项目在Visual Studio 2019中的工程化配置:告别零散文件,打造清晰结构 对于卫星导航领域的开发者而言,RTKLIB无疑是一个绕不开的开源项目。这个由日本学者Tomoji Takasu开发的GNSS定位软件,以其强大的功能和开放的架构…...
基于SpringBoot+Flowable的办公流程审批系统毕设源码
博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在构建一个基于Spring Boot与Flowable框架的办公流程审批系统以解决传统审批模式中存在的效率低下问题。当前多数组织机构在日常运营中普遍采用人工审批…...
GPT-4 API交互式实验场:开发者如何自建安全可控的Playground
1. 项目概述:一个面向开发者的GPT-4交互式实验场如果你是一名开发者,或者对大型语言模型(LLM)的应用开发感兴趣,那么你很可能已经不止一次地思考过:如何能更高效、更直观地测试GPT-4的API能力?如…...
ElevenLabs菲律宾语语音突然变卡顿?紧急排查清单:DNS劫持、Token过期、区域节点错配(含curl诊断脚本)
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs菲律宾语语音突然变卡顿?紧急排查清单:DNS劫持、Token过期、区域节点错配(含curl诊断脚本) 当ElevenLabs API在调用菲律宾语(fil-P…...






