队列的顺序存储结构

news/2024/5/18 13:40:45/文章来源:https://blog.csdn.net/qq_57484399/article/details/127334106

说白了,就是一个数组 ,然后在两端进行操作 ,两端用首队指针和尾指针分别指向 ,然后进行相关的删除,插入操作, 目的还是模拟现实对数据的处理

●描述队列

        •数据元素data , 元素具有同一类型ElemType ,最多为MaxSize(数组容量)

        •当前队首front

        •当前队尾 rear

定义队列的数据结构

typedef struct
{ElemType data[MaxSize];int front,rear;//队首和队尾指针
}SqQueue;


以上是我们的队列的存储结构, 队列中有存储数据的数组 ElemType data[MaxSize];

还有对数组进行操作的指针 front ,rear 

我们现在演示顺序队的操作:


初始的时候 , 是空队列 ,队首和队尾指针都指向空 

当元素入队的时候 , rear 后移,然后我们对其位置赋值元素 ,rear指向新元素



当出队的时候 ,front 是指向出队的元素的 ,当没有元素出队的时候 ,指向空 ,当出队的时候 ,front上移到 数组位序为 0的位置 ,并对其进行出队,  队首指针的下一个元素变成队首元素

下面我们分析 ,顺序队的四要素

● 队空条件 : front = rear

当队首指针 和 尾指针 重合的时候 ,我们就把最后一个新元素,进行了删除了 ,

所以队空条件 , 就是两者重合


● 队满条件 : rear = MaxSize - 1

因为我们数组坐标是从 0 开始算的 , 所以当队尾指针指向数组最后 一个位序时 , 队满


●元素 e 进队 : rear++ ; data[rear] = e;

我们队尾指针指向的是队列一个元素 , 所以 当我们要插入元素的时候 ,如果队列不满, 我们就把 指针所指的位序加一  ,然后把新元素进队就可以了


● 元素 e 出队: front ++ ; e = data[front];

我们这里 队首指针指向的是 , 队列第一个元素的前一个位置  , 所以当我们要进行出队操作的时候 , 我们才把 front 加一 ,然后指向第一个元素 ,符合 常识

(删除前,要判断是非是空队, 空队则无需删除)

初始化队列 InitQueue(q)

   ● 构造一个空队列 q ,然后将 front 和 rear 指针均设置成初始状态 ,即 -1 值.

//传入要构造的队列
void InitQueue(SqQueue *&q)
{q = (SqQueue *)malloc(sizeof(SqQueue));q -> front = q -> rear = -1;
}

这里把首尾指针道法都指向负一的妙处是: 我们一会儿插入元素时, 加一即可指向新元素

销毁队列 DestroyQueue(q)

● 释放队列 q 占用的存储空间


//传入要销毁的队列
void DestroyQueue(SqQueue *&q)
{free(q);
}

因为我们用数组来承接数据 ,结构单一 ,直接释放队列即可

判断队列是否为空 QueueEmpty(q)

        ●若队列 q 满足 q->front = q->rear 条件 , 则返回 true ; 否则返回 false.


//传入要判断是否为空的队列
bool QueueEmpty(SqQueue *q)
{return(q->front == q->rear);
}

•当初始的时候 , 队列内无元素 ,队首和队尾指针都指向 -1 , 当插入新元素的时候 , 尾指针指向新元素 ; 当我们删除元素的时候  , 队首指针指向要删除的元素 ;

所以当队首指针删除到队尾时候 , 栈为空 

进队列enQueue(q,e)

        ●条件

                •队列不满时

        ●操作

                •先将队尾指针 rear 增1 ,

                • 然后将新元素添加到该位置



//进队列 enQueue(q,e)
//传入要插入队列, 和新元素的值
bool enQueue(SqQueue *&q, ElemType e)
{//条件,队列不满if(q->rear = MaxSize-1){return false;}//不满,则可以插入新元素,队尾指针自增,指向新元素位置q->rear++;//数组承接 ,所以更改位序即可q->data[q->rear] = e;//插入成功,返回truereturn true;}

出队列 deQueue(q,e)

     ●条件

                •队列 q 不为空

     ● 操作

                •将队首指针 front 循环增 1

                •将该位置的元素赋值给 e



// 出队列 deQueue(q,e)
//传入要出队的队列地址指针,记录出队元素的地址
bool deQueue(SqQueue *&q,ElemType &e)
{//先判断是否队空,空则返回错误if(q -> front == q->rear){return false;}//不空,则删除第一个队列元素,因为我们队首指针//初始指向的是第一个元素的前一个位置,所以,队首指针自增1,传出元素即可q -> front++;e = q->data[q->front];//传出成功,则返回truereturn true;
}

上述顺序队列的基本操作已经完成 , 我们会注意到顺序队列的一个问题 ,当队首指针和队尾指针指向数组的最后一个元素时 , 队列表示队空, 但是,我们之前的元素还每利用



所以我们 , 现在遇到的问题就是, 我们增加元素,删除元素 ,此操作不能循环执行 

那怎么办呢? 我们既然 进行操作的时候 ,首尾指针到达了数组尾部 不能继续执行 ,我们就把数组的首尾链接起来, 形成循环队列,详见下节

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

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

相关文章

RK3588安装部署openmediavault

RK3588安装部署openmediavault部署准备Debian 10 文件系统编译和获取安装 openmediavault安装基础依赖安装 openmediavault 原秘钥环添加 openmediavault 官方原安装 openmediavault 基础依赖安装 openmediavaultopenmediavault 相关资料: https://docs.openmediav…

YOLOX 学习笔记

笔记来源:https://www.bilibili.com/video/BV1jo4y1D7CF/?vd_source2ed6e8af02f9ba8cb90b90e99bd4ccee 近年来,目标检测的工程应用研究中,YOLO系列以快速响应、高精度、结构简单以及容易部署的特点备受工程研究人员的青睐。同时,…

3. HDFS分布式文件系统

3.1 HDFS简介 随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布…

CloudlaC是什么?

目录1. CloudIaC的简介2. 部署安装2.1 下载并解压安装包2.2 安装并启动Docker2.3 安装并启动Mysql2.4 安装并启动 Consul2.5 编辑配置文件2.6 初始化MySQL2.7 安装iaC服务2.8 启动 IaC 服务2.9 拉取 ct-worker 镜像2.10 下载前端部署包并解压2.11 安装nginx并配置2.12 访问web页…

【笔试刷题训练】day_04

选择题 C/C中各种进制的表示方法 二进制:在数字的末尾加b,如101010b 八进制:在数字前面加数字0,如0123 十进制:数字本身,如123 十六进制:数字前面加0x 或者 数字后面加h,如0x123、12…

字节跳动C++云原生二面(65min)

字节跳动C云原生二面(65min) 面试问题 HTTP1.0 、1.1和2.0 的区别和差异是什么 《HTTP1.0和1.1的区别》HTTP1.1 默认开启长连接(keep-alive) 而HTTP1.0需要添加参数,在一定程度上减少了建立和关闭连接的消耗和延迟HT…

AntDesign-Vue Table 查询与分页

前言 之前的增删改查小 Demo 已经快要进行到最后一步了,这节的任务是将请求数据的方式改为 分页,并且增加 分页条件查询 的功能。 页面布局 <a-table:data-source="dataSource":columns="columns":pagination="pagination" > <!-- ↑…

02 docker安装

这里写目录标题CenterOS安装使用远程镜像仓库安装设置yum远程仓库第二步&#xff1a;安装docker安装第三步&#xff1a;docker镜像加速器debian/Ubuntu安装docker官网&#xff1a;https://www.docker.com/ docker镜像库&#xff1a;https://hub.docker.com/ Docker CE&#xf…

truffle安装问题-无法加载文件

在powershell 下输入以下命令 set-executionpolicy remotesigned问题解决搜索 复制

【C语言】文件版本通讯录

文章目录文件版本通讯录一、test.c&#xff08;通讯录主干&#xff09;1.通讯录菜单的实现2.创建通讯录&#xff0c;初始化通讯录3.通讯录功能的调用二、contact.c(函数的实现)1.通讯录初始化2.查看联系人是否存在函数实现3.单个修改联系人各项的信息函数实现4.修改联系人信息目…

【PyTorch深度学习项目实战100例】—— 基于Transformer实现Twitter文本隐喻二分类 | 第43例

前言 大家好,我是阿光。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPy…

[Vue] TodoList 案例

前言 系列文章目录&#xff1a; [Vue]目录 老师的课件笔记&#xff0c;不含视频 https://www.aliyundrive.com/s/B8sDe5u56BU 笔记在线版&#xff1a; https://note.youdao.com/s/5vP46EPC 视频&#xff1a;尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 文章目录前言1. 组件…

《uni-app》一个非canvas的飞机对战小游戏实现-敌机模型实现

这是一个没有套路的前端博主&#xff0c;热衷各种前端向的骚操作&#xff0c;经常想到哪就写到哪&#xff0c;如果有感兴趣的技术和前端效果可以留言&#xff5e;博主看到后会去代替大家踩坑的&#xff5e;接下来的几篇都是uni-app的小实战&#xff0c;有助于我们更好的去学习u…

行业大洗牌,软件测试饱和了?到底怎样才能走出职场困境......

人生三大emo瞬间&#xff1a;工作不顺&#xff0c;薪资不涨&#xff0c;求职被拒。 都说成年人的世界里没有容易二字&#xff0c;这句话在职场里体现地淋漓尽致&#xff1a; 工作5年&#xff0c;还没来得及升职&#xff0c;薪资被倒挂&#xff0c;岗位被优化&#xff1b;晚上…

无代码 AI 概览(Levity)

介绍 在构建我们自己的平台时&#xff0c;我们一直密切关注无代码 AI 领域。 我们意识到非技术人员构建定制的人工智能解决方案和人工智能驱动的流程自动化是多么困难。 虽然无代码市场作为一个整体正在成熟&#xff08;Dreamweaver 和 MS Frontpage&#xff0c;最早的 WYSIWYG…

开源在线客服系统源码(支持PC/H5/公众号/小程序)基于golang的网页在线客服系统

近年来市面上出现了越来越多的在线客服系统,还不断有新的在线客服企业加入,这让刚接触在线客服系统的人挑得眼花缭乱,那到底应该怎么选择一个适合企业使用的在线客服系统呢 我先给大家介绍下在线客服发展的历史,然后介绍下客服系统都有哪些功能,最后我们根据各类条件来筛选…

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

24. 两两交换链表中的节点 本题是一道模拟过程的题目。搞清楚两两交换的步骤之后,写出对应的代码也就不是难题了。不过在学习题解的过程中发现,两两交换的步骤也有很多种实现方式。自己在做题目的时候使用的思路如下:进行两两交换之前,设置三个指针,分别指向dummy,head和…

记录一下java生产环境CPU占用过高实例

背景&#xff1a;今天还是像往常一样下班后坐公交车回家&#xff0c;突然工作微信群里发来一个截图&#xff0c;我点开一看是我之前上线的服务占用CPU过高了导致程序直接卡死。记录分享一下我的解决思路希望可以帮到你们。 目录 1. top【先查看监控里每个逻辑cpu情况】 2. jm…

python题库刷题训练软件

未来教育 全国计算机等级考试 (qq.com)https://mp.weixin.qq.com/s?__bizMzkyNjQwODc2MA&mid2247483676&idx1&sn96daf350e5cb0542bbab621cbc8434b5&chksmc236884bf541015d868736e488791c4c90c06eb04339fb3923f02fc36fc5732b248f176c9bcd#rd 1、下列叙述中正确…

Linux/Ubuntu高级命令(二)

一、获取管理员权限相关命令 sudo命令 sudo&#xff1a;以管理员权限执行某个命令可以在命令前加上sudo&#xff0c;用于单次临时操作sudo -s&#xff1a;切换到root用户&#xff0c;获取管理员权限&#xff0c;用于大量操作whoami&#xff1a;查看当前用户exit&#xff1a;退…