数据结构(3.5)——队列的顺序实现

队列的顺序实现

#define MaxSize 10//定义队列中元素的最大个数
typedef struct {
	int data[MaxSize];//用静态数组存放队列元素
	int front, rear;//队头指针和队尾指针
} SqQueue;

void testQueue() {
	SqQueue Q;//声明一个队列(顺序存储)
}

队列的初始化操作和判空

//初始化队列
void InitQueue(SqQueue& Q) {
	//初始时 队头、队尾指针指向0
	Q->rear = Q->front = 0;
}
//判断队列是否为空
bool QueueEmpty(SqQueue Q) {
	if (q.rear == Q.front) {//判空条件
		return true;
	}
	else {
		return false;
	}
}

循环队列——入队操作

以下情况我们重点先考虑尾指针指向队尾元素的后一位情况

队列的入队操作只能从队尾入队(插入)

//入队
bool EnQueue(SqQueue& Q, int x) {
	if (Q.rear + 1) % MaxSize == Q.front){//判断队满
		return false;//队满报错
	}
	else {
		Q.data[Q.rear] = x;//新元素插入队尾
		Q.rear = (Q.rear + 1) % MaxSize;//队尾指针加1取模,队尾指针后移
		return true;
	}
}

该函数中的

		Q.rear = (Q.rear + 1) % MaxSize;//队尾指针加1取模

这一行代码实则是将一个顺序队列变成了循环队列

循环队列——入队操作

//出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue& Q, int& x) {
	if (Q.rear == Q.front) {//判断队空
		return false;//队空则报错
	}
	else {
		x = Q.data[Q.front];
		Q.front = (Q.front + 1) & MaxSize;//队头指针后移
		return true;
	}
}

循环队列——读取队头操作

读取队头的操作和出队操作很类似,只是将表格引用符号去掉,并且不要让队头指针往后移就行

//获得队头元素的值,用x返回
bool GetHead(SqQueue Q, int& x) {
	if (Q.rear == Q.front) {//判断队空
		return false;//队空则报错
	}
	else {
		x = Q.data[Q.front];
		return true;
	}
}
void testQueue() {
	SqQueue Q;//声明一个队列(顺序存储)
}

计算队列元素个数:

(rear+MaxSize-front)%MaxSize

方法二:增加一个辅助变量size判断空判满

由于刚刚第一种方法判空和判满会造成一些不必要的内存空间浪费,于是我们在队列中添加一个size来表示队列的长度,并且记录队列的入队和出队变化

typedef struct {
	int data[MaxSize];//用静态数组存放队列元素
	int front,rear;//队头指针和队尾指针
	int size;//队列当前长度
} SqQueue;
//初始化队列
void InitQueue(SqQueue& Q) {
	//初始时 队头、队尾指针指向0
	Q.rear = Q.front = 0;
	Q.size=0;
}

方法三:增加一个辅助变量tag判断空判满 

#define MaxSize 10//定义队列中元素的最大个数
typedef struct {
	int data[MaxSize];//用静态数组存放队列元素
	int front,rear;//队头指针和队尾指针
	int tag;//最近进行的是删除为0/插入为1
} SqQueue;

例子:

// 初始化队列
void InitQueue(SqQueue *Q) {
	Q->front = Q->rear = 0;
	Q->tag = 0;
}

// 判断队列是否为空
int IsEmpty(SqQueue Q) {
	return Q.front == Q.rear && Q.tag == 0;
}

// 判断队列是否已满
int IsFull(SqQueue Q) {
	return Q.front == Q.rear && Q.tag == 1;
}

// 入队操作
int EnQueue(SqQueue *Q, int x) {
	if (IsFull(*Q)) {
		return 0; // 队列已满,入队失败
	}
	Q->data[Q->rear] = x;
	Q->rear = (Q->rear + 1) % MaxSize; // 循环使用数组
	Q->tag = 1;
	return 1; // 入队成功
}

// 出队操作
int DeQueue(SqQueue *Q, int *x) {
	if (IsEmpty(*Q)) {
		return 0; // 队列为空,出队失败
	}
	*x = Q->data[Q->front];
	Q->front = (Q->front + 1) % MaxSize; // 循环使用数组
	Q->tag = 0;
	return 1; // 出队成功
}

 总结:

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

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

相关文章

昇思25天学习打卡营第11天 | LLM原理和实践:基于MindSpore实现BERT对话情绪识别

1. 基于MindSpore实现BERT对话情绪识别 1.1 环境配置 # 实验环境已经预装了mindspore2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2…

Rust变量绑定

变量绑定 Rust 通过静态类型确保类型安全。变量绑定可以在声明时说明类型,不过在多数情况下,编译器能够从上下文推导出变量的类型,从而大大减少了类型说明的工作。 使用 let 绑定操作可以将值(比如字面量)绑定&#…

ESP32 通过蓝牙显示歌词代码示例

通过蓝牙协议播放音乐,有的时候需要显示歌词,这里就是a2dp库获取了歌词 值得注意的是要想正确获取到歌词,必须打开各种播放器的字幕(歌词)开关 本项目用了三个开源库 a2dp,tft_espi,xfont. a2dp &#x…

ITWin Capture Modeler:打造卓越的软件模型的终极工具

在软件开发和设计领域,寻找一款高效且功能强大的软件模型工具是每个开发人员的追求。而经过多年的实践和尝试,我终于找到了一款令人印象深刻的工具——ITWin Capture Modeler。它不仅具备出色的功能和灵活性,而且能够极大地提高开发效率和质量…

计算机网络体系结构详解:协议与分层

在学习计算机网络时,理解网络协议与分层体系结构是至关重要的。本文将详细介绍这些概念,帮助基础小白快速入门。 1. 什么是网络协议 网络协议是计算机网络中用于数据交换的规则和标准。这些规则规定了数据格式、时序以及发送和接收数据时的动作。网络协…

数学不好能搞人工智能吗?

很遗憾,不能。 人工智能(AI)实际上是一个将数学、算法理论和工程实践紧密结合的领域。AI 扒开来看就是算法,也就是数学、概率论、统计学、各种数学理论的体现。 新的时代,程序员想要跨入 AI 之门,只要稍微…

FTP、http 、tcp

HTTP VS FTP HTTP :HyperText Transfer Protocol 超文本传输协议,是基于TCP协议 FTP: File Transfer Protocol 文件传输协议, 基于TCP协议, 基于UDP协议的FTP 叫做 TFTP HTTP 协议 通过一个SOCKET连接传输依次会话数…

奇舞周刊第532期:奇舞团生日快乐~

时光荏苒,岁月如歌,转眼间,奇舞团13岁啦🎂🎂🎂《奇舞周刊》也陪伴大家来到了第532期。👏👏 致敬每一位读者和创作者,是你们的热情、陪伴和鼓励,让我们不断前进…

【Linux】:进程创建与终止

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux程序地址空间的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从…

基于java+springboot+vue实现的图书商城管理系统(文末源码+Lw)283

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信…

java Web 优秀本科毕业论文系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 优秀本科毕业论文系统是一套完善的web设计系统,对理解JSP java serlvet 编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0&a…

【深度学习】图形模型基础(5):线性回归模型第三部分:线性回归模型拟合

1.引言 本博文专辑的焦点主要集中在回归模型的实用案例和工具上,从简单的单变量线性回归入手,逐步过渡到包含多个预测变量、非线性模型,以及在预测和因果推断中的应用。本文我们将介绍回归模型推断的一些数学结构,并提供一些代数…

YOLOv8模型调参---数据增强

目录 1.数据预处理 2.数据增强 2.1 数据增强的作用 2.2 数据增强方式与适用场景 2.2.1离线增强(Offline Augmentation) 2.2.2 在线增强(Online Augmentation) 3. 数据增强的具体方法 4. YOLOv8的数据增强 4.1 YOLOv8默认…

A股继续3000以下震荡,而国外股市屡创新高,人民币反弹能带动A股吗?

今天的A股,让人愤愤不已,你知道是为什么吗?盘面上出现3个耐人寻味的重要信号,一起来看看: 1、今天两市一度回踩2920点,让股民的心都开始悬起来了。而午后市场行情有了转变,下跌的股票开始明显变…

go 为什么是抢占式调度

GMP 模型 gmp模型是 golang 中用于调度管理 goroutine 的调度器。 调度器的发展史 在 Go 语言中,Goroutine 早期是没有设计成抢占式的,早期 Goroutine 只有读写、主动让出、锁等操作时才会触发调度切换。 这样有一个严重的问题,就是垃圾回…

【Mac】adobe CameraRaw 16 for mac(ps插件RAW处理工具)软件介绍

软件介绍 Adobe Camera Raw是一款专为处理和编辑数字照片原始文件(RAW文件)而设计的插件,它提供了丰富的功能来调整和优化图像。以下是它的主要特点和功能: 支持广泛的RAW格式: Adobe Camera Raw 16 支持处理来自各…

【深度学习】第3章实验——回归模型

根据相关数据集进行回归分析 1. import statsmodels.api as sm # df.loc[:, ...] 表示选择所有行。 # df.columns ! mpg 创建一个布尔数组,指示哪些列不等于 mpg。 # df.loc[:, df.columns ! mpg] 选择 df 中所有行和列名不等于 mpg 的所有列。 x df.loc[:,df.col…

在 Azure 云中开始使用适用于 Ubuntu 的 Grafana

介绍 Grafana 是一款开源工具,可用于可视化和分析数据。它特别适合跟踪计算机系统的运行情况。在构建微服务或其他类型的应用程序时,您可能需要分析日志数据、轻松可视化数据或设置特殊警报以接收有关系统中发生的某些事件的通知。 这就是为什么你可能…

ESD管ESD113-B1-02EL(S)国产替代型号ULC0342CDNH,ULC0321CDNH

雷卯型号全,能替代大量infineon型号。具体如下: 应用于3.3V高速信号静电保护器件,infineon的ESD113-B1-02EL(DFN1006)和ESD113-B1-02ELS(DFN0603),交期长,价格高。已经有很多客户选雷卯的 ULC0342CDNH(DFN1006)&#…

Linux 【线程池】【单例模式】【读者写者问题】

💓博主CSDN主页:麻辣韭菜💓   ⏩专栏分类:Linux初窥门径⏪   🚚代码仓库:Linux代码练习🚚   🌹关注我🫵带你学习更多Linux知识   🔝 目录 🏳️‍🌈前言 …