数据结构-3.5.队列的顺序实现


一.队列的顺序实现,初始化操作以及判断队列是否为空:

1.图解:

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义一个队列最多存储的元素个数 
​
typedef struct
{int data[MaxSize]; //用静态数组存放队列元素int front; //队头指针,队头删除元素 int rear; //队尾指针,队尾插入元素 
}SqQueue; 
​
//初始化队列
void InitQueue(SqQueue &Q)
{//初始时,队头和队尾指针都指向0 Q.front=0;//对头一开始就为0即第一个位置 Q.rear=0;//队尾指针指向下一个插入元素的位置,一开始没元素,下一个当然插在第一个位置即0索引处 
} 
​
//判断队列是否为空
bool QueueEmpty(SqQueue Q)
{if( Q.rear==Q.front ) //Q.rear==Q.front为队空条件 {return true; //代表队列为空 }else{return false; //代表队列不为空 } 
} 
​
int main()
{SqQueue Q; //声明一个队列(顺序存储)InitQueue(Q);//后续操作。。。 return 0;
}

二.队尾元素入队操作(添加数据元素):

1.图解:

a.判断队列是否已满:

b.举例,假设队尾指针指向9:

c.添加元素后:

d.队尾指针进行Q.rear = (Q.rear+1)%MaxSize操作后:对队列最大存储空间取模求出还能存几个元素

e.由于对队尾指针进行的操作是取余运算,会不断地从上到下的循环(比如除以3,余数只会是0,1,2),因此形成了一个闭环:

f.上述就是一个循环队列,循环队列还可以解决如下的队列假溢出的情况:

g.继续刚才的例子,此时还有空闲的空间,因此可以继续插入新的数据元素:

h.同时需要队尾指针不断的后移:

i.当队列只剩最后一个存储空间时,就认为此时队列已经满了:

可能会问,此时不是还剩一个存储空间吗,为什么认为满了呢,但需要注意的是,初始化队列时,队头指针和队尾指针是指向了同一个位置,因此判断是否队列已经满了,也需要看队头指针和队尾指针是否指向了同一个位置

(注:队尾指针指向下一个插入元素的位置)

j.总结:

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义一个队列最多存储的元素个数 
​
typedef struct
{int data[MaxSize]; //用静态数组存放队列元素int front; //队头指针,队头删除元素 int rear; //队尾指针,队尾插入元素 
}SqQueue; 
​
//初始化队列
void InitQueue(SqQueue &Q)
{//初始时,队头和队尾指针都指向0 Q.front=0;//对头一开始就为0即第一个位置 Q.rear=0;//队尾指向下一个插入元素的位置,一开始没元素,下一个当然插在第一个位置即0索引处 
} 
​
//判断队列是否为空
bool QueueEmpty(SqQueue Q)
{if( Q.rear==Q.front ) //Q.rear==Q.front为队空条件 {return true; //代表队列为空 }else{return false; //代表队列不为空 } 
} 
​
//入队
bool EnQueue(SqQueue &Q,int x)
{if( (Q.rear+1)%MaxSize==Q.front ){return false;//此时队满,返回false }//此时队没满Q.data[ Q.rear ] = x; /*新元素插入队尾,应该插在Q.rear处,因为Q.rear队尾指针指向下一个插入元素的位置,而新插入的x刚好就要在下一个插入元素的位置*/Q.rear = (Q.rear+1)%MaxSize; //队尾指针加一取模 return true;
} 
​
int main()
{SqQueue Q; //声明一个队列(顺序存储)InitQueue(Q);//后续操作。。。 return 0;
}

三.队头元素出队操作(删除数据元素):

1.图解:

注:这里x有&,调用完函数后x也就跟着改变了 ,x就是被删除的那个元素,队头指针后移就相当于删除了一个元素:

a.Q.front = (Q.front+1)%MaxSize,也需要对MaxSize取模,这样才能让front循环移动:

b.每次出队的都是front指针所指向的元素即x = Q.data[Q.front],并且队头指针会向后移一位:

c.当队头指针和队尾指针再次指向同一个位置时,此时队列已经被取空,此时不能再进行出队操作:

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义一个队列最多存储的元素个数 
​
typedef struct
{int data[MaxSize]; //用静态数组存放队列元素int front; //队头指针,队头删除元素 int rear; //队尾指针,队尾插入元素 
}SqQueue; 
​
//出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue &Q,int &x) //这里x有&,调用完函数后x也就跟着改变了 
{if( Q.rear==Q.front ) //首先要判断队列是否为空,因为空队列无法删除元素 {return false; //此时队列为空 }//此时队列不为空x = Q.data[Q.front];//把队头指针指向的元素赋值给变量x Q.front = (Q.front+1)%MaxSize;//队头指针后移一位,也需要对MaxSize取模,这样才能让front循环移动 return true; 
} 
​
int main()
{return 0;
}

四.查找队列中的元素:

1.图解:

通常只需要查询或者只需要读取队列中队头的元素:

获得队头元素的值即查找元素,用x返回。这里x有&,调用完函数后x也就跟着改变了,变为队头元素; x就是队头元素,获取到队头元素后可以与要查找的元素比较。

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义一个队列最多存储的元素个数 
​
typedef struct
{int data[MaxSize]; //用静态数组存放队列元素int front; //队头指针,队头删除元素 int rear; //队尾指针,队尾插入元素 
}SqQueue; 
​
//获得队头元素的值即查找元素,用x返回
/*这里x有&,调用完函数后x也就跟着改变了,变为队头元素; x就是队头元素,获取到队头元素后可以与要查找的元素比较*///相比出队操作,就少了一个Q.front = (Q.front+1)%MaxSize,就不让队头指针后移 
bool GetHead(SqQueue Q,int &x)
{if( Q.rear==Q.front )//需要判断队列是否为空,空队列无法查找元素 {return false;//队空返回false }//此时队列不为空x = Q.data[Q.front];return true; 
}
​
int main()
{return 0;
}

五.判断队列已满,已空:

1.队列此时已有的元素个数计算公式:

(队尾指针+队列最多存储个数-队头指针)%队列最多存储个数

2.方案一:牺牲一个存储空间来判断队列已满,已空

3.方案二:无需牺牲一个存储空间即可判断队列已满,已空

思路:在定义结构体队列时定义一个变量size,用来记录队列当前长度,size初始值为0,因为一开始没元素,

只要有元素入队,size自增;只要有元素出队,size自减

4.方案三:无需牺牲一个存储空间即可判断队列已满,已空

思路:在定义结构体队列时定义一个变量tag,初始化时tag为0,因为一开始没元素,可以认为是删除后才没元素

当tag为0时表示最近一次执行了一次删除操作,

当tag为1时表示最近一次执行了一次插入操作,


六.其他出题方式:

1.如果队尾指针指向最后一个元素而不是下一个元素要插入的位置,那么入队时就需要先让队尾指针后移一个位置,

腾出位置来添加元素,最后再添加元素

2.如果队尾指针指向最后一个元素而不是下一个元素要插入的位置,那么在初始化时,队头指针指向第一个位置,

队尾指针指向最后一个位置->这样的话在元素入队时就会先队尾指针后移一个位置,再取余就可以了


七.总结:

注:静态数组大小已经确定,因此要用模运算(取余运算)来重复地利用静态数组中各个空闲的存储空间。


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

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

相关文章

使用Buildpacks构建Docker镜像

## 使用Buildpacks构建Docker镜像 ![](../assets/运维手册-Buildpacks-Buildpacks.io.png) ### Buildpacks简介 与Dockerfile相比&#xff0c;Buildpacks为构建应用程序提供了更高层次的抽象。具体来说&#xff0c;Buildpacks&#xff1a; * 提供一个平衡的控制&#xff0c;…

emp.dll丢失损坏怎么办,总结6个解决emp.dll丢失的方法

我们在用电脑的时候&#xff0c;经常会碰到各种各样的问题&#xff0c;其中一个就是emp.dll丢失或缺失。这个东东可是Windows操作系统中非常重要的一个动态链接库文件哦&#xff0c;它是负责管理一些重要系统功能的。假如这个文件丢了&#xff0c;很可能会导致程序无法正常运行…

小程序图片资源等使用阿里服务链接更新问题

同名更换图片&#xff0c;小程序无需发版本更新&#xff0c;存在图片缓存问题解决方法 修改Cache-Control参数即可

深度解析:Python蓝桥杯青少组精英赛道与高端题型概览

目录 一、蓝桥杯青少组简介二、赛项组别与年龄范围三、比赛内容与题型1. 基础知识范围2. 题型设置2.1 选择题2.2 编程题 3. 考试时长 四、奖项设置与激励措施五、总结 一、蓝桥杯青少组简介 蓝桥杯全国软件和信息技术专业人才大赛&#xff08;简称“蓝桥杯”&#xff09;是由工…

【Qt+Python项目构建】- 01-首次配置 Qt Creator 14.01 for Python

前言&#xff1a; 如何用QT实现Python的配置的交互界面。本文从0开始&#xff0c;进行实践的介绍。 在上一节里面&#xff0c;我们做了社区版本的配置&#xff1a; https://blog.csdn.net/yellow_hill/article/details/142597007?spm1001.2014.3001.5501 这一节&#xff0…

【C++11】新特性

前言&#xff1a; C11 是C编程语言的一个重要版本&#xff0c;于2011年发布。它带来了数量可观的变化&#xff0c;包含约 140 个新特性&#xff0c;以及对 C03 标准中约600个缺陷的修正&#xff0c;更像是从 C98/03 中孕育出的新语言 列表初始化 C11 中的列表初始化&#xff0…

探索Kimi:用Spring Boot + Vue打造现代网站

在数字化时代&#xff0c;网站成为了企业和个人展示自己的窗口。今天&#xff0c;我将带你一起探索如何利用Spring Boot和Vue.js这两个强大的技术栈&#xff0c;结合Kimi的智能助手功能&#xff0c;来构建一个现代的网站。这不仅是一个技术分享&#xff0c;更是一次实战演示&am…

ubuntu22.04桌面美化

文章目录 原桌面自动隐藏任务栏图标居中去除桌面上的Home文件夹去除硬盘图标和垃圾箱图标壁纸网站 原桌面 自动隐藏任务栏图标居中 效果&#xff1a; 去除桌面上的Home文件夹 去除硬盘图标和垃圾箱图标 壁纸网站 https://hdqwalls.com/wallpaper/3840x2160/cherry-blossom-p…

【C++】二叉搜索树+变身 = AVL树

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言一、AVL树二、AVL树的实现2.1 平衡因子2.2 旋转处理2.2.1 左单旋&#xff1a;插入新节点后单纯的右边高2.2.2 …

MySQL--聚合查询、联合查询、子查询、合并查询(上万字超详解!!!)

目录 一、前言二、聚合查询2.1 聚合函数2.1.1 COUNT():统计所有行2.1.2 SUM(列名) 求和2.1.3 AVG()2.1.4 MAX()、MIN() 2.2 GROUP BY子句&#xff08;分组查询&#xff09;2.3 HAVING 三、联合查询3.1表的笛卡儿积3.2内连接3.2.1 例题一3.2.2 例题二 3.3外连接3.3.1 右外连接3.…

使用 Python 遍历文件夹

要解决这个问题&#xff0c;使用 Python 的标准库可以很好地完成。我们要做的是遍历目录树&#xff0c;找到所有的 text 文件&#xff0c;读取内容&#xff0c;处理空行和空格&#xff0c;并将处理后的内容合并到一个新的文件中。 整体思路&#xff1a; 遍历子目录&#xff1…

ConcurrentHashMap在JDK1.7和1.8的区别,详解

目录 1.了解HashMap底层插入原理 2.ConcurrentHashMap 是什么&#xff1f; HashTable的实现 3.ConcurrentHashMap 1.7和1.8的区别 4、JDK1.7 中的ConcurrentHashMap实现原理 6、JDK1.8中的ConcurrentHashMap 7.链表转红黑树条件 1.8 put方法 8.并发扩容 9.总结 首先呢…

Vite多环境配置与打包:

环境变量必须以VITE开头 1.VITE_BASE_API&#xff1a; 在开发环境中设置为 /dev-api&#xff0c;这是一个本地 mock 地址&#xff0c;通常用于模拟后端接口。 2.VITE_ENABLE_ERUDA&#xff1a; 设置为 "true"&#xff0c;表示启用调试工具&#xff0c;通常是为了…

Android Framework AMS(01)AMS启动及相关初始化1-4

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容分析过多&#xff0c;因此拆成2个章节&#xff0c;本章节是第一章节&…

用户在网页上输入一个网址,它整个页面响应的流程是什么?

目录 一、流程的大致过程 二、流程的详细分析 1. 浏览器先分析超链接中的URL 2. DNS解析 3. 建立TCP连接 建立连接&#xff08;三次握手&#xff09; HTTP中的请求报文 4. 浏览器发送HTTP请求 5. 服务器处理请求并发送响应 HTTP的响应报文 6. 浏览器接收响应 7. 渲…

音视频入门基础:FLV专题(12)——FFmpeg源码中,解析DOUBLE类型的ScriptDataValue的实现

一、引言 从《音视频入门基础&#xff1a;FLV专题&#xff08;9&#xff09;——Script Tag简介》中可以知道&#xff0c;根据《video_file_format_spec_v10_1.pdf》第80到81页&#xff0c;SCRIPTDATAVALUE类型由一个8位&#xff08;1字节&#xff09;的Type和一个ScriptDataV…

OpenJudge | 置换选择排序

总时间限制: 1000ms 内存限制: 65536kB 描述 给定初始整数顺串&#xff0c;以及大小固定并且初始元素已知的二叉最小堆&#xff08;为完全二叉树或类似完全二叉树&#xff0c;且父元素键值总小于等于任何一个子结点的键值&#xff09;&#xff0c;要求利用堆实现置换选择排序&a…

idea2024设置中文

今天下载idea2024.2版本&#xff0c;发现已经装过中文插件&#xff0c;但是还是不显示中文&#xff0c;找了半天原来还需要设置中文选项 方案一 点击文件 -> 关闭项目 点击自定义 -> 选择语言 方案二 点击文件 -> 设置 外观与行为 -> 系统设置 -> 语言和地区…

[深度学习][python]yolov11+bytetrack+pyqt5实现目标追踪

【算法介绍】 YOLOv11、ByteTrack和PyQt5的组合为实现高效目标追踪提供了一个强大的解决方案。 YOLOv11是YOLO系列的最新版本&#xff0c;它在保持高检测速度的同时&#xff0c;通过改进网络结构、优化损失函数等方式&#xff0c;提高了检测精度&#xff0c;能够同时处理多个…

高空抛物AI检测算法:精准防控,技术革新守护城市安全

近年来&#xff0c;随着城市化进程的加速&#xff0c;高楼大厦如雨后春笋般涌现&#xff0c;但随之而来的高空抛物问题却成为城市管理的一大难题。高空抛物不仅严重威胁行人的安全&#xff0c;还可能引发法律纠纷和社会问题。为了有效预防和减少高空抛物事件的发生&#xff0c;…