数据结构:队列(链表和数组模拟实现)

目录

1.何为队列

2.链表模拟实现

2.1 节点和队列创建

2.2 初始化队列

2.3 入队操作

2.4 出队操作

2.5 遍历队列

2.6 获取队首和队尾元素

2.7 判断队列是否为空

2.8 完整实现

3. 数组模拟实现

3.1 创建队列

3.2 入队和出队操作

3.3 遍历队列

3.4 获取队首和队尾元素

 3.5 判断队列是否为空

3.6 完整实现


1.何为队列

       队列也是一种数据结构,队列和栈不同的是,栈是先进后出,而队列是先进先出,这跟我们平时排队是一样的,先排的先办完事走,后排的后走,队列又被称为先进先出的线性表,简称FIFO(First In First Out)

       那队列是怎么来实现的呢?下面从链表和数组两个方面来模拟实现

2.链表模拟实现

2.1 节点和队列创建

       我们用链表来模拟每个队列元素,可以用链表节点来表示,data是数据域,next是指针域

typedef struct QueueNode
{
	int data;
	struct QueueNode* next;
}QueueNode;

      栈有栈顶,那队列也应该有队首和队尾

typedef struct Queue
{
	QueueNode* head, * tail;
	int size;
}Queue;

2.2 初始化队列

      创建一个队列和队首、队尾,并进行初始化

void QueueCreate(Queue* que)
{
	que->head = NULL;
	que->tail = NULL;
	que->size = 0;
}

2.3 入队操作

      万事具备,就差元素入队填满队列了!

      队列的插入操作叫做入队,它是将数据元素从队尾进行插入的过程

      4号元素是原先的队尾,在它后面插入元素6,就是入队的过程

      我们首先创建一个值为data的队列节点vtx,如果队尾非空,则将vtx作为队尾元素的后继,否则将队首元素置为vtx,队尾元素变成vtx,队列的长度加一。

void QueueEnter(Queue* que, int data)//入队就是将元素从队尾插入的过程
{

	QueueNode* vtx = (QueueNode*)malloc(sizeof(QueueNode));
	vtx->data = data;
	vtx->next = NULL;
	if (que->tail)
	{
		que->tail->next = vtx;
	}
	else
	{
		que->head = vtx;
	}
	que->tail = vtx;
	que->size++;
}

2.4 出队操作

      队列的删除操作叫做出队,它是将队首元素进行删除的过程。

      将队首变成原先队首的后继元素,就实现了出队操作

      我们将队首元素缓存到temp中,将当前的队首变成temp的后继,释放temp的内存,队列长度减一,如果此时队列为空,则将队尾置为空。

void QueueDelete(Queue* que)
{
	QueueNode* temp = que->head;
	que->head = temp->next;
	free(temp);
	que->size--;
	if (que->size == 0)
	{
		que->tail = NULL;
	}

2.5 遍历队列

    我们建立一个cur指向队首,如果cur!=NULL,则cur变为cur的后继

void QueueTravel(Queue* que)
{
	QueueNode* cur = que->head;
	while (cur)
	{
		printf("%d ", cur->data);
		cur = cur->next;
	}
	printf("\n");
}

2.6 获取队首和队尾元素

int QueueGetFront(Queue* que)//获取队首元素
{
	return que->head->data;
}
int QueueGetBack(Queue* que)//获取队尾元素
{
	return que->tail->data;
}

2.7 判断队列是否为空

     如果队首等于队尾,说明队列为空,否则队列不为空。

bool QueueIsEmpty(Queue* que)
{
	return que ->head == que->tail;
}

2.8 完整实现

#include<stdio.h>
#include<stdlib.h>
typedef struct QueueNode//创建队列节点
{
	int data;
	struct QueueNode* next;
}QueueNode;
typedef struct Queue//创建队列结构
{
	QueueNode* head, * tail;//队首允许删除,队尾允许插入
	int size;
}Queue;
void QueueCreate(Queue* que)//队列初始化
{
	que->head = NULL;
	que->tail = NULL;
	que->size = 0;
}
void QueueEnter(Queue* que, int data)//入队就是将元素从队尾插入的过程
{

	QueueNode* vtx = (QueueNode*)malloc(sizeof(QueueNode));
	vtx->data = data;
	vtx->next = NULL;
	if (que->tail)
	{
		que->tail->next = vtx;
	}
	else
	{
		que->head = vtx;
	}
	que->tail = vtx;
	que->size++;
}
void QueueDelete(Queue* que)//出队就是将元素从队尾删除的过程
{
	QueueNode* temp = que->head;
	que->head = temp->next;
	free(temp);
	que->size--;
	if (que->size == 0)
	{
		que->tail = NULL;
	}
}
void QueueTravel(Queue* que)//队列的遍历
{
	QueueNode* cur = que->head;
	while (cur)
	{
		printf("%d ", cur->data);
		cur = cur->next;
	}
	printf("\n");
}
int QueueGetFront(Queue* que)//获取队首元素
{
	return que->head->data;
}
int QueueGetBack(Queue* que)//获取队尾元素
{
	return que->tail->data;
}
bool QueueIsEmpty(Queue* que)//判断队列是否为空
{
	return que ->head == que->tail;
}
int main()
{
	Queue* que = (Queue*)malloc(sizeof(Queue));
	QueueCreate(que);
	int n;
	scanf_s("%d\n", &n);

	//执行n次入队操作
	while (n--)
	{
		int data;
		scanf_s("%d", &data);
		QueueEnter(que, data);
	}

	//遍历并打印队列元素
	QueueTravel(que);
	
	//打印队首元素
     printf("队首元素为:%d\n", QueueGetFront(que));

	//打印队尾元素
	 printf("队尾元素为:%d\n", QueueGetBack(que));

	//判断队列是否为空
	printf("%d",QueueIsEmpty(que));

	return 0;
	
}

3. 数组模拟实现

3.1 创建队列

     在用数组创建队列时,不需要我们开辟空间,数组已经开好了

const int N = 100010;
int q[N];//队列
int hh = 0;//hh表示队首
int tt = -1;//tt表示队尾

3.2 入队和出队操作

     我们只需要hh++即可完成队首元素的删除操作,并不是真的删除,而是把队首元素的下标从队列数组中剔除了。

q[++tt] = x;//入队
hh++;//出队

3.3 遍历队列

//遍历并打印队列每个元素的值
for (int i = 0; i <=tt;i++)
{
	printf("%d ", q[i]);
}
printf("\n");

3.4 获取队首和队尾元素

//获取队首的值
printf("队首的值为:%d\n", q[hh]);

//获取队尾的值
printf("队尾的值为:%d\n", q[tt]);

3.5 判断队列是否为空

     如果hh<=tt说明队列不为空

//判断队列是否为空,如果hh<=tt,则表示不为空
if (hh <= tt)printf("队列不为空");

3.6 完整实现

#include<stdio.h>
const int N = 100010;
int q[N];
int hh = 0;//hh表示队首
int tt = -1;//tt表示队尾
int main()
{
	int n;
	scanf_s("%d", &n);
	
	while (n--)
	{
		int x;
		scanf_s("%d", &x);
		q[++tt] = x;//入队操作,向队尾插入一个数
	}

	//遍历并打印队列每个元素的值
	for (int i = 0; i <=tt;i++)
	{
		printf("%d ", q[i]);
	}
	printf("\n");

	hh++;//出队操作,从队首删除一个数
	printf("队首的值为:%d\n", q[hh]);
	
	//判断队列是否为空,如果hh<=tt,则表示不为空
	if (hh <= tt)printf("队列不为空");

	return 0;
}

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

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

相关文章

LLM应用的分块策略

每日推荐一篇专注于解决实际问题的外文&#xff0c;精准翻译并深入解读其要点&#xff0c;助力读者培养实际问题解决和代码动手的能力。 欢迎关注公众号 原文标题&#xff1a;Chunking Strategies for LLM Applications 原文地址&#xff1a;https://www.pinecone.io/learn/c…

FPGA项目(13)——基于FPGA的电梯控制系统

1.摘要 随着科技的发展&#xff0c;电梯早在上个世纪就已进入人们的生活。对于电梯的控制&#xff0c;传统的方法是使用继电器——接触器控制系统进行控制。随着EDA技术的发展&#xff0c;FPGA已广泛应用于各项电子设计中&#xff0c;本设计即利用FPGA来实现对电梯控制系统的设…

事务失效的十种常见场景

学习事务失效场景 1 概述 事务的传播类型isolationTransactionnal注解属性 事务方法未被Spring管理方法使用final类型修饰非public修饰的方法同一个类中的方法相互调用方法的事务传播类型不支持事务异常被内部catch&#xff0c;程序生吞异常数据库不支持事务未配置开启事务错…

媒体捕捉-拍照

引言 在项目开发中&#xff0c;从媒体库中选择图片或使用相机拍摄图片是一个极为普遍的需求。通常&#xff0c;我们使用UIImagePickerController来实现单张图片选择或启动相机拍照。整个拍照过程由UIImagePickerController内部实现&#xff0c;无需我们关心细节&#xff0c;只…

Spring Boot整合 EasyExcel 实现复杂 Excel 表格的导入与导出功能

文章目录 1. 简介2. 引入依赖3. 导入功能实现3.1 创建实体类3.2 编写导入 Controller3.3 编写导入页面 4. 导出功能实现4.1 编写导出 Controller4.2 编写导出页面 5. 启动应用 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &…

HttpClient入门

HttpClient入门 简介 HttpClient 是 Apache HttpComponents 项目中的一个开源的 Java HTTP 客户端库&#xff0c;用于发送 HTTP 请求和处理 HTTP 响应。它提供了一组强大而灵活的 API&#xff0c;使得在 Java 程序中执行 HTTP 请求变得相对简单 maven依赖 org.apache.httpco…

C语言操作符下

在这篇文章中&#xff0c;主要讲解关系操作符、条件操作符、逻辑操作符&#xff0c;及其短路。 一. 关系操作符 C语言用于比较的表达式&#xff0c;称为关系表达式&#xff0c;里面运用的运算符就称“关系运算符”&#xff0c;主要有下面6个&#xff1a; < 小于运算符>…

基于Vite创建简单Vue3工程

首先安装node.js环境&#xff0c;没有node.js环境&#xff0c;便没有npm命令。 1、Vue3创建执行命令 D:\TABLE\test>npm create vuelatestVue.js - The Progressive JavaScript Framework√ 请输入项目名称&#xff1a; ... vue_test √ 是否使用 TypeScript 语法&#xff…

【C++】Windows编译FileZilla Client

按照Compiling FileZilla 3 under Windows - FileZilla Wiki (filezilla-project.org)操作即可。 1.下载安装MSYS2 msys2-x86_64-20220118.exe 2.更新MSYS2 进入MSYS2 MinGW 64-bit shell&#xff0c;运行 pacman -Syu重复退出shell&#xff0c;更新MSYS2。直到没有可更新…

【Maven】工程依赖下载失败错误解决

在使用 Maven 构建项目时&#xff0c;可能会发生依赖项下载错误的情况&#xff0c;主要原因有以下几种&#xff1a; 下载依赖时出现网络故障或仓库服务器宕机等原因&#xff0c;导致无法连接至 Maven 仓库&#xff0c;从而无法下载依赖。 依赖项的版本号或配置文件中的版本号错…

详解Vue3中的事件监听方式

本文主要介绍Vue3中的事件监听方式。 目录 一、v-on指令二、使用符号简写三、事件修饰符四、动态事件名五、常见的监听事件六、自定义事件 在Vue3中&#xff0c;事件监听的方式与Vue2有一些不同。 下面是Vue3中事件监听方式的详细介绍&#xff1a; 一、v-on指令 Vue3中仍然使…

[嵌入式AI从0开始到入土]9_yolov5在昇腾上推理

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…

OCP NVME SSD规范解读-3.NVMe管理命令-part2

NVMe-AD-8&#xff1a;在某些情况下&#xff08;如Sanitize命令、Format NVM命令或TCG Revert方法后数据被清除&#xff09;&#xff0c;设备应允许读取已清除的LBAs而不产生错误&#xff0c;并在最后一次清除完成后&#xff0c;对未写入LBAs的读取返回所有零值给主机 NVMe-AD…

【北亚数据恢复】mysql表被truncate,表数据被delete的数据恢复案例

云服务器数据恢复环境&#xff1a; 华为ECS云服务器&#xff0c;linux操作系统&#xff0c;mysql数据库&#xff08;innodb引擎&#xff09;。作为网站服务器使用。 云服务器故障&#xff1a; 在执行mysql数据库版本更新测试时&#xff0c;误将本应该在测试库上执行的sql脚本执…

【JavaScript】浮点数精度问题

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

移动端开发框架mui代码在安卓模拟器上运行2(HbuilderX连接到模拟器)模拟器窗口及多开设置

开发工具 HBuilder X 3.8.12.20230817 注意&#xff1a;开发工具尽量用最新的或较新的。太旧的版本在开发调试过程中可能会出现莫名其妙的问题。 接上篇&#xff0c;移动端开发框架mui代码在安卓模拟器上运行&#xff08;HbuilderX连接到模拟器&#xff09;&#xff0c;这篇主要…

Mediapipe绘制实时3d铰接骨架图——Mediapipe实时姿态估计

一、前言 大约两年前&#xff0c;基于自己的理解我曾写了几篇关于Mediapipe的文章&#xff0c;似乎帮助到了一些人。这两年&#xff0c;忙于比赛、实习、毕业、工作和考研。上篇文章已经是一年多前发的了。这段时间收到很多私信和评论&#xff0c;请原谅无法一一回复了。我将尝…

HarmonyOS 实践之应用状态变量共享

平时在开发的过程中&#xff0c;我们会在应用中共享数据&#xff0c;在不同的页面间共享信息。虽然常用的共享信息&#xff0c;也可以通过不同页面中组件间信息共享的方式&#xff0c;但有时使用应用级别的状态管理会让开发工作变得简单。 根据不同的使用场景&#xff0c;ArkTS…

HarmonyOS 组件通用属性之通用事件 文档参数讲解(触摸事件)

好 本文 我们来说说触摸事件 字面意思也非常好理解 就是我们手机手指触摸物体触发 我们先在编辑器组件介绍中 找到这个东西的基本用法 Button("跳转").onTouch((event: TouchEvent) > {})最明显的就是 event 的类型变了 点击事件的是 ClickEvent 而这里是 Touc…

14 2023.12.31 --------release--------misc--------

呵呵 一部分 misc 存在草稿箱好久了 而且 也并没有那么重要, 直接放出去吧 今年的 专业技能方面的收获主要是一些方面 linux 方面, 这部分内容主要是集中在上半年 90 telnet 连接上对方服务之后 立即 “Connection closed by foreign host.“ 89 重写 /proc/sys/vm/nr_pd…