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

news2024/11/28 5:35:02

目录

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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机组成原理复习4

习题 练习题 下列不属于系统总线的为&#xff08;&#xff09; a.数据总线 b.地址总线 c.控制总线 d.片内总线 D 系统总线中地址总线的功能是&#xff08;&#xff09; a.选择主存单元地址 b.选择进行信息传输的设备 c.选择外存地址 d.指定主存和I/O设备接口电路的地址 D 解…

【电商项目实战】商品详情显示与Redis存储购物车信息

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《电商项目实战》。&#x1f3af;&#x1f3af; &am…

第9章 继承和派生习题(详解)

一、选择题 1&#xff0e;下列表示引用的方法中&#xff0c; &#xff08;&#xff09; 是正确的。已知&#xff1a;int m10&#xff1a; A&#xff0e;int &xm&#xff1b; B&#xff0e;int &y10&#xff1b; C&#xff0e;int &z&#xff1b; D&#xff0e;fl…

[CISCN 2019华东南]Web11

[CISCN 2019华东南]Web11 wp 信息搜集 页面内容如下&#xff1a; 右上角显示的是我的当前 IP 。 在最下角提示&#xff1a;Build With Smarty ! Smarty 是 PHP 的一个模板引擎&#xff0c;那么这道题应该是 Smarty 模板注入。 Smarty 模板注入 可以参考博客&#xff1a;Sm…

4年微博热搜数据,一次拿走

又是新的一年了&#xff0c;从2020年开始&#xff0c;就养成了定时备份各大平台热搜数据的习惯&#xff0c;微博&#xff0c;知乎都在备份&#xff0c;今天给大家看一下从2020年到2023年的微博热搜数据情况 这是2022年的备份数据&#xff0c;每天的热搜数据一个文件&#xff0c…

[蓝桥杯基础题型] 图论题目

遍历 添加路障 首先答案只能是0 1 2 &#xff0c;原因&#xff1a;把出发点堵住只需要两个路障 路障为0&#xff1a;不能找到一条从出发点到终点的路 路障为1&#xff1a;能找到一条从出发点到终点的路&#xff0c;但是只有一条 路障为2&#xff1a;能找到一条从出发点到终…

Origin 2021软件安装包下载及安装教程

Origin 2021下载链接&#xff1a;https://docs.qq.com/doc/DUnJNb3p4VWJtUUhP 1.选中下载的压缩包&#xff0c;然后鼠标右键选择解压到"Origin 2021"文件夹 2.双击打开“Setup”文件夹 3.选中“Setup.exe”鼠标右键点击“以管理员身份运行” 4.点击“下一步" 5…

SELinux 安全模型——MLS

首发公号&#xff1a;Rand_cs BLP 模型&#xff1a;于1973年被提出&#xff0c;是一种模拟军事安全策略的计算机访问控制模型&#xff0c;它是最早也是最常用的一种多级访问控制模型&#xff0c;主要用于保证系统信息的机密性&#xff0c;是第一个严格形式化的安全模型 暂时无…

SQL性能优化-索引

1.性能下降sql慢执行时间长等待时间长常见原因 1&#xff09;索引失效 索引分为单索、复合索引。 四种创建索引方式 create index index_name on user (name); create index index_name_2 on user(id,name,email); 2&#xff09;查询语句较烂 3&#xff09;关联查询太多join&a…

Embedding模型在大语言模型中的重要性

引言 随着大型语言模型的发展&#xff0c;以ChatGPT为首&#xff0c;涌现了诸如ChatPDF、BingGPT、NotionAI等多种多样的应用。公众大量地将目光聚焦于生成模型的进展之快&#xff0c;却少有关注支撑许多大型语言模型应用落地的必不可少的Embedding模型。本文将主要介绍为什么…

【SpringCloud Alibaba笔记】(2)Nacos服务注册与配置中心

Nacos Nacos简介与下载 是什么&#xff1f; 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;就是注册中心&#xff0b;配置中心的组合 Nacos Eureka Config Bus 替代Eureka…

初识HTTP协议

Web服务器可以接收浏览器的请求&#xff0c;并将服务器中的web项目资源响应给浏览器&#xff0c;浏览器与服务器之间进行网络通信遵循HTTP协议。 一、什么是HTTP协议 超文本传输协议&#xff08;HTTP&#xff0c;HyperText Transfer Protocol&#xff09;(浏览器---->web服务…

27 UVM queue

uvm_queue类构建一个动态队列&#xff0c;该队列将按需分配并通过引用传递。 uvm_queue类声明&#xff1a; class uvm_queue #( type T int ) extends uvm_object 1 uvm_queue class hierarchy 2 uvm_queue class Methods 3 UVM Queue Example 在下面的示例中&#xff0c;…

基于深度卷积神经网络的垃圾分类识别系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文详细介绍了一基于深度卷积神经网络的垃圾分类识别系统。采用TensorFlow和Keras框架&#xff0c;通过卷积神经网络&#xff08;CNN&#xff09;进行模型训练和预测。引入迁移学习中的VGG16模型…

Linux:apache优化(7)—— 日志分割|日志合并

作用&#xff1a;随着网站访问量的增加&#xff0c;访问日志中的信息会越来越多&#xff0c; Apache 默认访问日志access_log单个文件会越来越大&#xff0c;日志文件体积越大&#xff0c;信息都在一个文件中&#xff0c;查看及分析信息会及不方便。 分割 实现方式&#xff1a…

『JavaScript』JavaScript事件类型详解:全面解析各类用户交互行为

&#x1f4e3;读完这篇文章里你能收获到 理解事件驱动编程的基本概念和工作原理掌握JavaScript中常见的事件类型及其应用场合学习如何使用DOM API添加和移除事件监听器探讨事件冒泡、事件捕获和事件委托等高级事件处理技术 文章目录 一、事件处理程序1. HTML事件处理HTML事件处…

单片机键盘程序设计举例

1、键盘与的连接 图3键盘连接 图4单片机与键盘接口图 2、通过1/0口连接。将每个按钮的一端接到单片机的I/O口&#xff0c;另一端接地&#xff0c;这是最简单的办法&#xff0c;如图3所示是实验板上按钮的接法&#xff0c;四个按钮分别接到P3.2 、P3.3、P3.4和P3.5。对于这种键…

HttpClient入门

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

72内网安全-域横向CSMSF联动及应急响应知识

拿到才行&#xff0c;拿不到就是多余的 案例一MSF&CobaltStrike 联动 Shell 有一些功能可能cs或者msf强大一些&#xff0c;他们两个可以相互调用&#xff0c;在真实情况下也是可以cs和msf同时启动的&#xff0c; cs移交给msf .创建Foreign监听器 “Listeners”“Add”…

[NAND Flash 4.2] Flash 原理 | NOR Flash 和 NAND Flash 闪存详解

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 前言 智能手机有一个可用的存储空间(如苹果128G),电脑里有一个固态硬盘空间(如联想512G), 这个空间是啥呢? 这个存储空间就是闪存设备,我们都统称为…