考研篇——数据结构王道3.2.2_队列的顺序实现
目录
- 1.实现方式说明
- 2.代码实现
- 2.1
- 2.1.1 代码1
- 2.1.2 代码2
- 2.1.3 代码3
- 2.2
- 2.2.1 代码4
- 2.2.5 代码5
- 2.2.6 代码6
- 总结
1.实现方式说明
多在选择题中考察
队尾指针(rear)有两种指向方式:
- 队尾指针指向队尾元素的位置,
- 队尾指针指向队尾元素的下一个位置。
区分队空与队满:
- 牺牲一个存储空间,利用队头元素和队尾元素的相对位置来区分队空与队满。
- 增加一个变量size记录队列元素个数
- 增加一个变量tag记录操作是删除(tag为0)还是插入(tag为1),插入后rear(队尾)=front是队满,删除后rear=front是队空。
所以队列的实现一共有六种情况

书写代码注意操作实现的前提条件,也就是逻辑问题:
- 查、删的前提是队列非空,要进行判断;
- 插入的前提是队列不满,要进行判断。
静态数组实现的队列是循环队列,为了循环利用空间,rear的下一个元素为(rear+1)%MaxSize.
2.代码实现
2.1
2.1.1 代码1
C++静态数组实现rear(队尾指针)指向队尾元素的下一个元素,且牺牲一个存储空间来区分队满和队空的判断。
这种情况下队列的长度为(rear+MaxSize-front)%MaxSize.
#include <stdio.h>
#include <assert.h>
#define MaxSize 10
typedef int ElemType;
typedef struct {ElemType data[MaxSize];int front, rear;
}SqQueue;
void InitQueue(SqQueue &Q)
{Q.rear = Q.front = 0;
}
bool QueueEmpty(SqQueue Q)
{if (Q.rear == Q.front)return true;elsereturn false;
}
bool EnQueue(SqQueue& Q,ElemType x) {if ((Q.rear + 1) % MaxSize == Q.front)return false;Q.data[Q.rear] = x;Q.rear = (Q.rear + 1) % MaxSize;return true;
}
bool DeQueue(SqQueue& Q, ElemType& x)
{if (QueueEmpty(Q))return false;x = Q.data[Q.front];Q.front = (Q.front + 1) % MaxSize;return true;
}
bool GetHead(SqQueue Q, ElemType& x)
{//assert(!QueueEmpty(Q));if (QueueEmpty(Q))return false;x = Q.data[Q.front];return true;
}
void testQueue()
{SqQueue Q;InitQueue(Q);//printf("%d\n",QueueEmpty(Q));EnQueue(Q, 5);int x = 0;DeQueue(Q, x);GetHead(Q, x);printf("%d\n",x);
}
int main() {testQueue();return 0;
}
后续代码与代码1相同的部分省略
2.1.2 代码2
C++静态数组实现rear(队尾指针)指向队尾元素的下一个元素,且增加一个变量size记录队列长度来区分队满和队空的判断。
//队尾指针指向队尾元素
//引入size变量来记录队列元素个数
typedef struct {ElemType data[MaxSize];int front, rear;int size;
}SqQueue;
void InitQueue(SqQueue& Q)
{Q.rear = Q.front = 0;Q.size = 0;
}
bool QueueEmpty(SqQueue Q)
{if (Q.size==0)return true;elsereturn false;
}
bool EnQueue(SqQueue& Q, ElemType x) {if (Q.size==MaxSize)//队满的判断return false;Q.data[Q.rear] = x;Q.rear = (Q.rear + 1) % MaxSize;Q.size++;return true;
}
bool DeQueue(SqQueue& Q, ElemType& x)
{if (QueueEmpty(Q))return false;x = Q.data[Q.front];Q.front = (Q.front + 1) % MaxSize;Q.size--;return true;
}
2.1.3 代码3
C++静态数组实现rear(队尾指针)指向队尾元素的下一个元素,且增加一个变量tag来记录判断前队列的上一步操作是入队还是出队来区分队满和队空的判断。
//队尾指针指向队尾元素
//引入tag变量来记录队列元素个数,元素入队tag为1,出队tag为1
typedef struct {ElemType data[MaxSize];int front, rear;int tag;
}SqQueue;
void InitQueue(SqQueue& Q)
{Q.rear = Q.front = 0;Q.tag = 0;
}
bool QueueEmpty(SqQueue Q)
{if (Q.rear == Q.front&&Q.tag==0)return true;elsereturn false;
}
bool EnQueue(SqQueue& Q, ElemType x) {if (Q.rear == Q.front && Q.tag == 1)return false;Q.data[Q.rear] = x;Q.rear = (Q.rear + 1) % MaxSize;Q.tag = 1;return true;
}
bool DeQueue(SqQueue& Q, ElemType& x)
{if (QueueEmpty(Q))return false;x = Q.data[Q.front];Q.front = (Q.front + 1) % MaxSize;Q.tag = 0;return true;
}
其实我们遇到的问题是,Q.rear==Q.front可以表示队空和队满两种状态,那么我们考虑怎么将二者分开呢?1.牺牲一个存储单元,将队满对队空的判断条件区别开;2.增加size变量;3.增加tag变量,只有入队之后才有可能队满,出队之后才有可能队空。
三种情况的对比图如下:

2.2
2.2.1 代码4
C++静态数组实现rear(队尾指针)指向队尾元素,且牺牲一个存储空间来区分队满和队空的判断。
//队尾指针指向队尾元素下一个元素
//牺牲一个存储空间
void InitQueue(SqQueue& Q)
{Q.rear = -1;Q.front = 0;
}
bool QueueEmpty(SqQueue Q)
{if ((Q.rear + 1) % MaxSize == Q.front)return true;elsereturn false;
}
bool EnQueue(SqQueue& Q, ElemType x) {if ((Q.rear + 2) % MaxSize == Q.front)return false;Q.rear = (Q.rear + 1) % MaxSize;Q.data[Q.rear] = x;return true;
}
bool DeQueue(SqQueue& Q, ElemType& x)
{if (QueueEmpty(Q))return false;x = Q.data[Q.front];Q.front = (Q.front + 1) % MaxSize;return true;
}
2.2.5 代码5
C++静态数组实现rear(队尾指针)指向队尾元素,且增加一个变量size记录队列长度来区分队满和队空的判断。
typedef struct {ElemType data[MaxSize];int front, rear;int size;
}SqQueue;
void InitQueue(SqQueue& Q)
{Q.rear = -1;Q.front = 0;Q.size=0;
}
bool QueueEmpty(SqQueue Q)
{if (Q.size==0)return true;elsereturn false;
}
bool EnQueue(SqQueue& Q, ElemType x) {if (Q.size==MaxSize)return false;Q.rear = (Q.rear + 1) % MaxSize;Q.data[Q.rear] = x;Q.size++;return true;
}
bool DeQueue(SqQueue& Q, ElemType& x)
{if (QueueEmpty(Q))return false;x = Q.data[Q.front];Q.front = (Q.front + 1) % MaxSize;Q.size--;return true;
}
2.2.6 代码6
C++静态数组实现rear(队尾指针)指向队尾元素的下一个元素,且增加一个变量tag来记录判断前队列的上一步操作是入队还是出队来区分队满和队空的判断。
typedef struct {ElemType data[MaxSize];int front, rear;int tag;
}SqQueue;
void InitQueue(SqQueue& Q)
{Q.rear = -1;Q.front = 0;Q.tag=0;
}
bool QueueEmpty(SqQueue Q)
{if (Q.tag==0)return true;elsereturn false;
}
bool EnQueue(SqQueue& Q, ElemType x) {if ((Q.rear + 1) % MaxSize == Q.front &&Q.tag==0)return false;Q.rear = (Q.rear + 1) % MaxSize;Q.data[Q.rear] = x;Q.tag=1;return true;
}
bool DeQueue(SqQueue& Q, ElemType& x)
{if (QueueEmpty(Q))return false;x = Q.data[Q.front];Q.front = (Q.front + 1) % MaxSize;Q.tag=0;return true;
}
总结
以上部分为王道课件代码,部分为自写代码,有问题欢迎交流。
注:王道本身图画得很形象,此处不再做图,有兴趣的伙伴可以去看一下王道该章节的内容。
相关文章:
考研篇——数据结构王道3.2.2_队列的顺序实现
目录 1.实现方式说明2.代码实现2.12.1.1 代码12.1.2 代码22.1.3 代码3 2.22.2.1 代码42.2.5 代码52.2.6 代码6 总结 1.实现方式说明 多在选择题中考察 队尾指针(rear)有两种指向方式: 队尾指针指向队尾元素的位置,队尾指针指向…...
从零开始理解 Trie 树:高效字符串存储与查找的利器【自动补全、拼写检查】
题目分析 这道题让我们实现一个 Trie 类(也称为前缀树),以便高效地插入和查询字符串。前缀树是一种特殊的树形数据结构,适用于快速存储和检索字符串数据集中的键,比如实现 自动补全 和 拼写检查。 题目要求 Trie 类…...
关于sse、websocket与流式渲染
一、SSE是什么? 网络中的 SSE (Server-Sent Events) 是一种服务器向浏览器单向推送数据的机制,常用于需要实时更新的数据传输,如新闻推送、股票行情、聊天应用等。 SSE 的特点: 单向通信:服务器向客户端推送数据&…...
Python 语法与数据类型详解
Python 语法与数据类型详解 Python 以其简洁易读的语法和丰富多样的数据类型在编程领域占据重要地位。深入理解 Python 的语法和数据类型是掌握这门语言的关键。 一、Python 语法概述 (一)缩进规则 Python 独特的缩进规则是其语法的重要特征之一。与…...
LeetCode题练习与总结:扁平化嵌套列表迭代器--341
一、题目描述 给你一个嵌套的整数列表 nestedList 。每个元素要么是一个整数,要么是一个列表;该列表的元素也可能是整数或者是其他列表。请你实现一个迭代器将其扁平化,使之能够遍历这个列表中的所有整数。 实现扁平迭代器类 NestedIterato…...
51单片机快速入门之 AD(模数) DA(数模) 转换 2024/10/25
51单片机快速入门之 AD(模数) DA(数模) 转换 2024/10/25 声明:本文图片来源于网络 A模拟信号特点: 电压或者电流 缓慢上升 随着时间连续缓慢上升或下降 D数字信号特点:电压或者电流 保持一段时间的高/低电平 状态 / 突变 (高电压瞬间低电压) 数字电路中 通常将0-1v电压称…...
Typora 、 Minio and PicGo 图床搭建
流程介绍 本地安装Typora笔记工具拥有一台装有docker的服务器配置minio云图床管理控制页面下载PicGo上传工具服务器Docker环境搭建—Ubuntu系统 删除旧docker的所有依赖(非root用户) # 删除docker及安装时自动安装的所有包 sudo apt-get autoremove docker docker-ce docker…...
【计网】UDP Echo Server与Client实战:从零开始构建简单通信回显程序
目录 前言: 1.实现udpserver类 1.1.创建udp socket 套接字 --- 必须要做的 socket()讲解 代码实现:编辑 代码讲解: 1.2.填充sockaddr_in结构 代码实现: 代码解析: 1.3.bind sockfd和…...
微服务网关Zuul
一、Zuul简介 Zuul是Netflix开源的微服务网关,包含对请求的路由和过滤两个主要功能。 1)路由功能:负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。 2)过滤功能:负责对请求的过程…...
BuildCTF线上赛WP
Build::CTF flag不到啊战队--WP 萌新战队,还请多多指教~ 目录 Build::CTF flag不到啊战队--WP Web ez!http find-the-id Pwn 我要成为沙威玛传奇 Misc what is this? 一念愚即般若绝,一念智即般若生 别真给我开盒了哥 四妹,你听…...
《使用Gin框架构建分布式应用》阅读笔记:p143-p207
《用Gin框架构建分布式应用》学习第10天,p143-p207总结,总计65页。 一、技术总结 1.auth0 本人实际工作中未遇到过,mark一下,参考:https://auth0.com/。 2.使用template (1)c.File() (2)router.Static() (3)rou…...
华为网络管理配置实例
目录 组网需求 数据规划 配置思路 操作步骤 结果验证 配置脚本 管理员可以通过eSight网管系统对FW进行监控和管理,接收FW的告警。 组网需求 如图1所示,某企业在网络边界处部署了FW作为安全网关,并部署了eSight网管系统对网络设备进行集中…...
大语言模型数据处理方法(基于llama模型)
文章目录 前言一、基于huggingface的DataCollatorForSeq2Seq方法解读1、DataCollatorForSeq2Seq方法2、batch最长序列填充3、指定长度填充二、构建大语言模型数据加工模块1、数据读取2、数据加工1、数据格式2、预训练(pretrain)数据加工3、微调(sft)数据加工①、sft数据加工…...
爱奇艺大数据多 AZ 统一调度架构
01# 导语 爱奇艺大数据技术广泛应用于运营决策、用户增长、广告分发、视频推荐、搜索、会员营销等场景,为公司的业务增长和用户体验提供了重要的数据驱动引擎。 多年来,随着公司业务的发展,爱奇艺大数据平台已积累了海量数据,这…...
【C++篇】栈的层叠与队列的流动:在 STL 的韵律中探寻数据结构的优雅之舞
文章目录 C 栈与队列详解:基础与进阶应用前言第一章:栈的介绍与使用1.1 栈的介绍1.2 栈的使用1.2.1 最小栈1.2.2 示例与输出 1.3 栈的模拟实现 第二章:队列的介绍与使用2.1 队列的介绍2.2 队列的使用2.2.1 示例与输出 2.3 队列的模拟实现2.3.…...
使用 Flask 实现简单的登录注册功能
目录 1. 引言 2. 环境准备 3. 数据库设置 4. Flask 应用基本配置 5. 实现用户注册 6. 实现用户登录 7. 路由配置 8. 创建前端页面 9. 结论 1. 引言 在这篇文章中,我们将使用 Flask 框架创建一个简单的登录和注册系统。Flask 是一个轻量级的 Python Web 框架…...
计算机毕业设计Python+大模型微博情感分析 微博舆情预测 微博爬虫 微博大数据 舆情分析系统 大数据毕业设计 NLP文本分类 机器学习 深度学习 AI
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 《Python大模型微博情感分析…...
CTF--Misc题型小结
(萌新笔记,多多关照,不足之处请及时提出。) 不定时更新~ 目录 密码学相关 文件类型判断 file命令 文件头类型 strings读取 隐写术 尺寸修改 文件头等缺失 EXIF隐写 thumbnail 隐写 文件分离&提取 binwalk foremo…...
深度学习系列——RNN/LSTM/GRU,seq2seq/attention机制
1、RNN/LSTM/GRU可参考: https://zhuanlan.zhihu.com/p/636756912 (1)对于这里面RNN的表示中,使用了输入x和h的拼接描述,其他公式中也是如此 (2)各符号图含义如下 2、关于RNN细节,…...
通过call指令来学习指令摘要表的细节
E8 cw cw 表示E8后面跟随2 字节 (什么数不知道) rel16 指在与指令同一代码段内的相对地址偏移 D ,指向Instruction Operand Encoding 表中的D列, 他告诉我们 操作数1 是一个0FFSET N.S. 在64位模式下,某些指令需要使用“地址覆盖前缀”(address over…...
PX4无人机开发实战:5个关键ROS话题的订阅与发布详解(附代码示例)
PX4无人机开发实战:5个关键ROS话题的订阅与发布详解(附代码示例) 当你在PX4无人机开发中首次接触ROS通信时,可能会被各种话题和服务搞得晕头转向。作为连接飞控与外部系统的桥梁,这些通信接口直接决定了无人机的可控性…...
TrafficMonitor插件完全指南:打造终极个性化Windows监控中心
TrafficMonitor插件完全指南:打造终极个性化Windows监控中心 【免费下载链接】TrafficMonitorPlugins 用于TrafficMonitor的插件 项目地址: https://gitcode.com/gh_mirrors/tr/TrafficMonitorPlugins TrafficMonitor作为Windows系统监控工具,通过…...
DDR5信号完整性解析:JESD79-5标准下的AC/DC输入测量关键指标
1. DDR5信号完整性的核心挑战 DDR5作为新一代内存标准,将数据传输速率推向了前所未有的高度。但随之而来的信号完整性问题,却让不少硬件工程师头疼不已。想象一下,当数据速率突破6400MT/s时,信号在传输线上就像是在走钢丝…...
Comsol光子晶体:谷霍尔效应、单胞与超胞能带计算及谷单向传输
Comsol光子晶体谷霍尔效应。 单胞,超胞能带计算。 谷单向传输等。光子晶体玩拓扑这件事最近越来越上头。今天咱们撸起袖子直接干一个谷霍尔效应仿真,手把手教你在COMSOL里搞出单向传输这种神奇现象。先说重点:结构旋转6度就能打开带隙&#x…...
Video2X问答指南:用AI无损放大视频的10个常见问题解答
Video2X问答指南:用AI无损放大视频的10个常见问题解答 【免费下载链接】video2x A lossless video/GIF/image upscaler achieved with waifu2x, Anime4K, SRMD and RealSR. Started in Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/…...
一维卷积与RNN的融合策略:高效处理长序列数据的实战指南
1. 为什么需要融合一维卷积与RNN? 在处理长序列数据时,我们常常面临两个关键挑战:局部模式识别和长期依赖建模。一维卷积神经网络(CNN)擅长捕捉局部特征,比如音频信号中的音素或文本中的短语模式࿱…...
M5Stack舵机驱动库:PCA9685硬件PWM控制与多平台移植
1. 项目概述M5Hat-8Servos 是专为 M5Stack 生态设计的硬件驱动库,用于控制 M5Stack 官方推出的HAT-8SERVO扩展模块。该模块基于PCA9685 16通道12位PWM LED与伺服驱动芯片,通过 IC 总线与主控(如 M5Stack Core2、M5Stamp C3、M5Paper 等&#…...
MS5803-14BA I²C驱动开发:嵌入式压力传感器实战指南
1. MS5803-14BA压力传感器库深度解析:面向嵌入式工程师的IC驱动开发实践1.1 传感器核心特性与工程定位MS5803-14BA是TE Connectivity(原Measurement Specialties)推出的高精度数字压力/温度复合传感器,采用MEMS压阻式传感原理与Δ…...
从IPython和REPL中找灵感:用prompt_toolkit打造你的专属Python交互式环境
从IPython和REPL中找灵感:用prompt_toolkit打造你的专属Python交互式环境 在Python开发者的日常工作中,交互式环境是不可或缺的伙伴。无论是快速验证代码片段、调试复杂逻辑,还是探索数据结构和API行为,一个优秀的交互式环境能显…...
foobox-cn:让foobar2000从工具变身艺术品的终极美化方案
foobox-cn:让foobar2000从工具变身艺术品的终极美化方案 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 你是否还在忍受foobar2000那过于朴素的默认界面?是否觉得功能强大的播…...
