数据结构实验2:队列的应用

目录

一、实验目的

二、实验原理

1.1 队列的基本操作

1.1.1 队列的定义

1.1.2 队列的初始化

1.1.3 入队操作

1.1.4 出队操作

 1.1.5 检查队列是否为空

1.1.6 返回队列的长度 

2.1队列的运用

三、实验内容

问题描述

代码

截图

分析


一、实验目的

1、理解并掌握队列的逻辑结构和存储结构;理解队列的相关基本运算;

2、编程对相关算法进行验证;

3、学会利用队列解决实际问题。

二、实验原理

队列是一种数据结构,它遵循先进先出(First In First Out,FIFO)的原则。队列通常用于在程序中按顺序存储和访问数据元素。

1.1 队列的基本操作

1.1.1 队列的定义

可以使用结构体来定义队列的基本结构。一个典型的队列结构可能包括一个数组(用于存储数据元素)和两个指针(分别指向队列的前端和后端)。

#define MAX_SIZE 100

typedef struct Queue {
	int array[MAX_SIZE];
	int front, rear;
};

front指向队列的第一个元素,rear指向队列的最后一个元素。

1.1.2 队列的初始化

在使用队列之前,需要进行初始化。将队列的前端和后端指针都设置为-1,表示队列为空。

void Initialize_Queue(Queue* queue) {
	queue->front = -1;
	queue->rear = -1;
}

1.1.3 入队操作

将元素添加到队列的后端。在进行入队操作时,需要更新队列的rear指针。

void enqueue(Queue* queue,int elem) {
	if ((queue->rear == (MAX_SIZE - 1))&&(queue->front==0)) {//如果队列已满
		cout << "队列已满,不可再添加元素"<<endl;
		return;
	}
	if(queue->front==-1){//如果队列为空,更新front指针
		queue ->front = 0;
	}
	queue->rear++;
	queue->rear = queue->rear % MAX_SIZE;
	queue->array[queue->rear] = elem;//添加到队尾
}

其中队列为空时,front指针要更新,这个不容易想得到 

1.1.4 出队操作

 从队列的前端移除元素。在进行出队操作时,需要更新队列的front指针。

int dequeue(Queue* queue) {
	int elem;
	if (queue->front == -1) {//如果队列为空
		cout << "队列为空" << endl;
		return -1;
	}
	elem=queue->array[queue->front];
	if (queue->front == queue->rear) {//如果队列中只有一个元素,则将队列清空
		Initialize_Queue(queue);
	}
	else {
		queue->front++;
		//循环队列的关键之处
		if (queue->front > (MAX_SIZE - 1)) {
			queue->front = 0;
		}
	}
	return elem;
}

 1.1.5 检查队列是否为空

通过检查front指针是否为-1,可以确定队列是否为空。

int IsEmpty(Queue* queue) {
	return queue->front == -1;//空返回1,否则返回0
}

1.1.6 返回队列的长度 

int size(Queue* queue) {
	if (queue->rear < queue->front) {//队尾在队首前
		return queue->rear + MAX_SIZE - queue->front + 1;
	}
	else {
		return queue->rear - queue->front + 1;
	}
}

2.1队列的运用

  1. 任务调度: 操作系统使用队列来管理待执行的任务。进程按照先进先出(FIFO)的顺序排队等待执行。

  2. 广度优先搜索(BFS): 在图算法中,广度优先搜索使用队列来按层次顺序遍历图中的节点。它常用于寻找最短路径、解决迷宫问题等。

  3. 打印队列: 打印队列用于打印机管理,确保文档按照提交的顺序进行打印。

  4. 缓冲区管理: 队列常被用作缓冲区,处理数据传输或异步通信过程中的临时存储。

  5. 网络数据包处理: 网络路由器和交换机使用队列来存储和处理传入的数据包,确保按照先进先出的顺序进行处理。

  6. 消息传递系统: 队列用于消息队列系统,允许系统中的不同组件之间进行异步通信。

  7. 多线程编程: 在多线程环境中,队列可用于线程之间的安全数据传递。一个线程将数据放入队列,而另一个线程从队列中取出数据。

  8. 模拟: 队列经常用于模拟系统,例如银行服务窗口模拟、汽车排队等。

  9. 调度算法: 在调度算法中,队列可用于管理进程或任务的执行顺序。

  10. 计算机网络中的流量控制: 队列用于调整网络流量,以防止过载和拥塞。

三、实验内容

问题描述

编写一个程序,实现链队列的各种基本运算, (MAXQSIZE=5),并在此基础上设计一个主程序完成如下功能:

(1)初始化队列 q;

(2)判断队列 q 是否为空;

(3)依次进队列元素 1,12,-10;

(4)出队一个元素,并输出该元素;

(5)输出队列的长度(元素个数);

(6)依次进队元素 13,-12,10;

(7)输出队列长度;

(8)输出出队序列

代码

#include<iostream>
using namespace std;
#define MAX_SIZE 5

typedef struct Queue {
	int array[MAX_SIZE];
	int front, rear;
};

void Initialize_Queue(Queue* queue) {
	queue->front = -1;
	queue->rear = -1;
}

void enqueue(Queue* queue,int elem) {
	if ((queue->rear == (MAX_SIZE - 1))&&(queue->front==0)) {//如果队列已满
		cout << "队列已满,不可再添加元素"<<endl;
		return;
	}
	if(queue->front==-1){//如果队列为空,更新front指针
		queue ->front = 0;
	}
	queue->rear++;
	queue->rear = queue->rear % MAX_SIZE;
	queue->array[queue->rear] = elem;//添加到队尾
}

int dequeue(Queue* queue) {
	int elem;
	if (queue->front == -1) {//如果队列为空
		cout << "队列为空" << endl;
		return -1;
	}
	elem=queue->array[queue->front];
	if (queue->front == queue->rear) {//如果队列中只有一个元素,则将队列清空
		Initialize_Queue(queue);
	}
	else {
		queue->front++;
		//循环队列的关键之处
		if (queue->front > (MAX_SIZE - 1)) {
			queue->front = 0;
		}
	}
	return elem;
}

int IsEmpty(Queue* queue) {
	return queue->front == -1;//空返回1,否则返回0
}

int size(Queue* queue) {
	if (queue->rear < queue->front) {//队尾在队首前
		return queue->rear + MAX_SIZE - queue->front + 1;
	}
	else {
		return queue->rear - queue->front + 1;
	}
}

int main() {
	Queue q;
	int data,a;
	Initialize_Queue(&q);//初始化队列q
	if (IsEmpty(&q) == 1) {
		cout << "队列为空" << endl;
	}
	else {
		cout << "队列不为空"<<endl;
	}
	for (int i = 0; i < 3; i++) {
		cin >> data;
		enqueue(&q, data);
	}
	a = dequeue(&q);//出队一个元素
	cout << "出队第一个元素:"<<a << endl;
	int length = size(&q);
	cout <<"输出队列的长度:"<< length << endl;
	for (int i = 0; i < 3; i++) {
		cin >> data;
		enqueue(&q, data);
	}
	length = size(&q);
	cout << "输出队列的长度:" << length << endl;
	if (q.rear < q.front) {//队尾在队首之前
		q.rear += MAX_SIZE;
	}
	for (int i = q.front; i <= q.rear; i++)
	{
		cout << q.array[i%MAX_SIZE]<<" ";
	}
	return 0;
}

截图

分析

由于采用的是循环队列,则由于将10入队时,队尾指针在队首指针前面,若采用非循环队列,则10入队时,队列已满

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

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

相关文章

Pod的亲和性和反亲和性

如何部署pod是重要的集群的调度机制&#xff0c;合理的配置pod调度机制可以实现资源最大化利用。 调度策略匹配标签操作符拓扑域调度目标node的亲和性主机标签In、NotIn、Exists、DoesNotExist、Gt、Lt不支持指定主机pod的亲和性pod的标签In、NotIn、Exists、DoesNotExist支持…

【DNS Server Spoofed Request Amplification DDoS漏洞修复】

文章目录 前言 之前对公司服务器做漏洞扫描&#xff0c;发现扫描工具提示存在这样一个漏洞&#xff0c;本来觉得漏洞利用率低&#xff0c;而且扫描百度&#xff0c;QQ等网站也会有此漏洞&#xff0c;主要是找了很久资料也不知道如何修复&#xff0c;所以暂未处理。但是近期由于…

基于ODBC的数据库应用(MFC)

文章目录 1.预备知识1.数据库概述1.数据库和DBMS2.结构化查询语言SQL(Structured Query Language)3.数据库方式种类1.ODBC(Open DataBase Connectivity)开放数据库连接2.DAO(Data Access Objects)数据访问对象3.OLE DB(OLE数据库) 2.MFC ODBC1.CRecordset类构造记录集属性记录集…

制作更好的待办事项清单的方法有哪些?

在忙碌的工作、学习或生活中&#xff0c;我们都渴望变得更加自律&#xff0c;希望每件事都能有目标、有计划地高效完成。而要实现这一愿望&#xff0c;一个精心制作的待办事项清单无疑是不可或缺的。那么&#xff0c;制作更好的待办事项清单的方法有哪些&#xff1f;高效的待办…

C++深入学习之模板

为什么需要模板 先来看下面一段程序&#xff1a; int add(int x, int y) {return x y; }double add(double x, double y) {return x y; }long add(long x, long y) {return x y; }string add(string x, string y) {return x y; }//T1 T2 T3 T3 add(T1 x, T2 y) {return…

Apache ActiveMQ 远程代码执行漏洞分析

漏洞简介 Apache ActiveMQ官方发布新版本&#xff0c;修复了一个远程代码执行漏洞&#xff0c;攻击者可构造恶意请求通过Apache ActiveMQ的61616端口发送恶意数据导致远程代码执行&#xff0c;从而完全控制Apache ActiveMQ服务器。 影响版本 Apache ActiveMQ 5.18.0 before …

docker部署firefox浏览器,实现远程访问

拉取firefox镜像&#xff0c;部署代码 docker run -d --name firefox -e TZAsia/Hong_Kong -e DISPLAY_WIDTH1920 -e DISPLAY_HEIGHT1080 -e KEEP_APP_RUNNING1 -e ENABLE_CJK_FONT1 -e VNC_PASSWORD12345678ABCabc -p 5800:5800 -p 5900:5900 -v /docker/firefox/config:/…

阿里云计算平台大数据基础工程技术团队直聘!!!

大数据基础工程技术团队&#xff0c;隶属于阿里云智能集团计算平台事业部&#xff0c;是一支负责阿里集团、公共云和混合云场景计算平台大数据&AI产品的稳定性建设、架构&成本优化、运维产品ABM&#xff08;Apsara Big data Manager&#xff09;研发和售后技术专家支持…

05、Kafka ------ 各个功能的作用解释(主题和分区 详解,用命令行和图形界面创建主题和查看主题)

目录 CMAK 各个功能的作用解释&#xff08;主题&#xff09;★ 主题★ 分区★ 创建主题&#xff1a;★ 列出和查看主题 CMAK 各个功能的作用解释&#xff08;主题&#xff09; ★ 主题 Kafka 主题虽然也叫 topic&#xff0c;但它和 Pub-Sub 消息模型中 topic 主题及 AMQP 的 t…

好用的AI写作软件,这6款助你轻松写作

这几年&#xff0c;AI在线写作平台在国内市场上呈现出蓬勃发展的态势&#xff0c;这些写作软件能够帮助用户快速生成高质量的文章。下面我将介绍国内的6款AI在线写作平台&#xff0c;一起来看看吧&#xff01; 第一个爱制作AI 爱制作AI是拥有智能创作的AI在线写作平台之一&…

深兰科技AI医疗健康产品获3000台采购订单

12月6日&#xff0c;武汉某企业与深兰科技签署协议&#xff0c;一次性采购3000台深兰科技AI生理健康检测仪——扁鹊。 深兰科技AI生理健康检测仪——扁鹊是深兰科技推出的人体生理指标检测产品。基于AI生物技术、融合互联网医疗及AIoT技术&#xff0c;深兰科技AI生理健康检测仪…

限制选中指定个数CheckBox控件(2/2)

实例需求&#xff1a;工作表中有8个CheckBox控件&#xff08;下文中简称为控件&#xff09;&#xff0c;现在需要实现限制用户最多只能勾选4个控件。 在上一篇博客中已经实现了这个需求&#xff0c;其基本思路是用户选中第5个控件时&#xff0c;事件代码将取消勾选最后一个选中…

弱光图像增强算法(6大算法附程序),一站式解决论文实验比较部分

过往几年大量从事弱光图像增强的炒菜工作。 为了方便科研比较&#xff0c;也就是主观视觉比较和定量比较&#xff0c;提供一个集成程序给各位参考 非常简单&#xff0c;只需要点击Main.PY和修改输出的路径即可 本次收集的6类算法(EnlightenGAN, RUAS, SCI, ZeroDCE, ZeroDCE…

python封装接口自动化测试套件 !

在Python中&#xff0c;我们可以使用requests库来实现接口自动化测试&#xff0c;并使用unittest或pytest等测试框架来组织和运行测试套件。以下是一个基本的接口自动化测试套件封装示例&#xff1a; 首先&#xff0c;我们需要安装所需的库&#xff1a; pip install requests …

运动耳机怎么选?2024年运动耳机推荐,运动蓝牙耳机排行榜10强

​在现代生活中&#xff0c;音乐和运动已经成为很多人生活不可分割的一部分。运动耳机在这样的背景下变得越来越受欢迎&#xff0c;它们不仅可以在运动时提供音乐的陪伴&#xff0c;还能增加运动时的乐趣和动力。但是&#xff0c;面对市面上众多不同类型的运动耳机&#xff0c;…

Linux进程通信之管道

目录 1、无名管道 1.无名管道的特点 2.pipe函数创建管道 3.图例 2、命名管道&#xff08;FIFO&#xff09; 1.命名管道的特点 2.mkfifo 函数-创建命名管道 3.示例 1.循环读取数据 2.循环写入数据 1、无名管道 管道通常指的就是无名管道&#xff0c; 1.无名管道的特点…

校招行测,认知能力测验,④破解数量关系测试题

数量关系&#xff0c;值得是数量计算、对比和分析&#xff0c;每种题型都有一定的规律性&#xff0c;如果善于终结也是容易掌握的&#xff0c;当然&#xff0c;只有见多&#xff0c;才能识广&#xff0c;最好的方式就是&#xff0c;锻炼&#xff0c;刷题&#xff0c;就算是临时…

3D Web可视化开发工具包HOOPS Communicator:提供Web端浏览大型模型新方案!

前言&#xff1a;HOOPS Communicator是Tech Soft 3D旗下的主流产品之一&#xff0c;具有强大的、专用的高性能图形内核&#xff0c;专注于基于Web的高级3D工程应用程序。其由HOOPS Server和HOOPS Web Viewer两大部分组成&#xff0c;提供了HOOPS Convertrer、Data Authoring的模…

类和对象的定义以及使用

文章目录 1. 类和对象的基本概念1.1 JAVA是面向对象语言1.2 类和对象的描述 2. 类与对象的定义与使用2.1 类的定义格式2.2 类的实例化(对象的创建)2.3 举个例子 3. 对象的构造及初始化3.1构造方法3.1.1构造方法的定义3.1.2 构造方法的特性 4.2 默认初始化5.4 就地初始化 4.this…

九州金榜如何让孩子在家庭教育中更优秀

​ 每个人在出生时就有上天恩赐的两份礼物&#xff0c;一份是血脉相连的亲情&#xff0c;一份是家庭的关爱与教育。 最早接触的人就是父母&#xff0c;最早接触的教育就是家庭教育&#xff0c;这对孩子的影响极为深远。 这种家庭教育相比较学校教育&#xff0c;不仅有言传教…