数据结构-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.如果队尾指针指向最后一个元素而不是下一个元素要插入的位置,那么在初始化时,队头指针指向第一个位置,
队尾指针指向最后一个位置->这样的话在元素入队时就会先队尾指针后移一个位置,再取余就可以了
七.总结:
注:静态数组大小已经确定,因此要用模运算(取余运算)来重复地利用静态数组中各个空闲的存储空间。
相关文章:

数据结构-3.5.队列的顺序实现
一.队列的顺序实现,初始化操作以及判断队列是否为空: 1.图解: 2.代码: #include<stdio.h> #define MaxSize 10 //定义一个队列最多存储的元素个数 typedef struct {int data[MaxSize]; //用静态数组存放队列元素int f…...
preconnect 预解析
preconnect 是一种浏览器优化技术,用于告诉浏览器提前与指定的域名建立连接,包括DNS解析、TCP握手和TLS协商(如果适用)。这样做可以减少客户端在请求资源时所需的往返时间(RTT),从而提高页面加载…...

Leecode热题100-283.移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...

如何高效使用Prompt与AI大模型对话
一、如何与人工智能对话 在人工智能的世界里,提示词(Prompt)就像是一把钥匙,能够解锁AI智能助手的潜力,帮助你更高效地获取信息、解决问题。但如何正确使用这把钥匙,却是一门艺术。本文将带你了解提示词的…...

Java 之深入理解 String、StringBuilder、StringBuffer
前言 由于发现 String、StringBuilder、StringBuffer 面试的时候会经常问到,这里就顺便总结一下:本文重点会以这三个字符串类的性能、线程安全、存储结构这三个方面进行分析 ✨上期回顾:Java 哈希表 ✨目录 前言 String 介绍 String 的不可变…...

vue3项目执行pnpm update后还原package.json文件后运行报错
项目场景: vue官方版本已更新到vue3.5,项目中还在使用vue3.4,因此想要更新项目vue版本。 问题描述 执行了 pnpm update 命令,一键更新了所有包,更新完成后项目不能正常运行。为了还原项目代码,先删除 nod…...

蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555
蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555 第一节 硬件解读第二节 CubeMx配置第三节 代码1,脉冲部分代码2,ADC部分代码 第一节 …...
SolveigMM Video Splitter方便快捷视频分割合并软件 V3.6.1309.3-供大家学习研究参考
视频分割功能(Splitter)支持各种编码格式的AVI(DivX、DV、MJPEG、XVID、MPEG-4)、WMV、ASF(DivX、MJPEG、XVID、MPEG-4、WM Video 7/9)F、MPEG(*.mpg、*.mpeg、*.mpv、*.m2v、*.vob)文件、也支持受损的WMV、ASF格式的分割。视频合并功能(Joiner)则支持AVI、WMV/ASF、WMA、MP3、…...

Unity3D 创建一个人物,实现人物的移动
1,创建项目 首先打开我们的Unity Hub 在我们的编译器下面新建项目,选择3D模板,更改一下我们的项目名称,选择一下路径,然后点击创建项目 等待项目创建。。。。。。 我们在项目里先创建一个plane,这样有点视…...

【笔记】数据结构12
文章目录 2013年408应用题41方法一方法二 看到的社区的一个知识总结,这里记录一下。 知识点汇总 2013年408应用题41 解决方法: 方法一 (1)算法思想 算法的策略是从前向后扫描数组元素,标记出一个可能成为主元素的元…...

django的URL配置
1 django如何处理一个请求 首先Django要使用根URLconf模块,通过setting.py配置文件的ROOT_URLCONF来设置。 加载该模块后并查找变量 urlpatterns。这是一个Python的django.conf.urls.url()实例列表。 Django按顺序运行每个URL模式,并在匹配所请求的…...

精华帖分享 | 因子构建思考1
本文来源于量化小论坛股票量化板块精华帖,作者为z-coffee。 以下为精华帖正文: 一段时间没写帖子,其实一直在研究策略,只是从不同的角度去思考而已。熟悉我的老板其实清楚,我的炉子水平一般,基本不太依托…...
kubernetes笔记(四)
一、Pod调度策略 1.基于节点的调度 spec->nodeName [rootmaster ~]# vim myhttp.yaml --- kind: Pod apiVersion: v1 metadata:name: myhttp spec:nodeName: node-0001 # 基于节点名称进行调度containers:- name: apacheimage: myos:httpd[rootmaster ~]# kubectl a…...

通信工程学习:什么是SNMP简单网络管理协议
SNMP:简单网络管理协议 SNMP(Simple Network Management Protocol,简单网络管理协议)是一种用于在计算机网络中管理网络节点(如服务器、工作站、路由器、交换机等)的标准协议。它属于OSI模型的应用层&#…...

ubuntu20.04系统下,c++图形库Matplot++配置
linux下安装c图形库Matplot,使得c可以可视化编程;安装Matplot之前,需要先安装一个gnuplot,因为Matplot是依赖于此库 gnuplot下载链接: http://www.gnuplot.info/ 一、gnuplot下载与安装(可以跳过,下面源码…...

[激光原理与应用-126]:南京科耐激光-激光焊接 - 焊中无损检测技术 - 智能制程监测系统IPM介绍 - 26- 频域分析法
目录 一、什么是频域分析法 1、定义 2、基本原理 3、分析步骤 4、应用领域 5、优缺点 二、频域分析法在激光焊接故障监测中的应用 2.1 概述 1、应用背景 2、频域分析法的应用 3、应用优势 4、应用实例 2.2 激光焊接故障检测中光电信号的频谱特征 1、光电信号分类…...
深入理解 Solidity 修饰符(Modifier):功能、应用与最佳实践
1. 什么是修饰符(Modifier)? 1.1 修饰符的定义 在 Solidity 中,修饰符(Modifier)是一种用于更改函数行为的关键字。它们可以用于控制函数的执行条件、添加前置检查、简化重复逻辑等。修饰符在函数执行之前…...

YOLO11项目实战1:道路缺陷检测系统设计【Python源码+数据集+运行演示】
一、项目背景 随着城市化进程的加速和交通网络的不断扩展,道路维护成为城市管理中的一个重要环节。道路缺陷(如裂缝、坑洞、路面破损等)不仅影响行车安全,还会增加车辆的磨损和维修成本。传统的道路缺陷检测方法主要依赖人工巡检…...
怎么屏蔽统计系统统计到的虚假ip
屏蔽统计系统中的虚假IP是保护网站分析数据准确性的重要措施。以下是一些有效的策略和步骤,可以帮助您过滤掉虚假IP: 1. 识别虚假IP的特征 了解虚假IP的常见特征可以帮助您识别和屏蔽它们: 短时间内高频率访问:虚假IP可能会在短…...
前端开发设计模式——策略模式
目录 一、策略模式的定义和特点 1.定义: 2.特点: 二、策略模式的实现方式 1.定义策略接口: 2.创建具体策略类: 3.定义上下文类: 三、策略模式的应用场景 1.表单验证场景: 2.动画效果切换场景&…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...