首页 > 其他分享 >数据结构(队列的实现)

数据结构(队列的实现)

时间:2024-07-13 17:26:13浏览次数:13  
标签:assert head pq 队列 链表 queue 实现 数据结构

目录

队列

队列的定义

队列的实现

创建队列的结构

队列的初始化

进行插入数据

删除数据

计算个数

 判断是否为空

返回队列头部数据

返回队列尾部数据


队列

队列的定义

队列是:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。

队列的实现

队列也可以数组和链表的结构实现

使用数组实现队列
优点:

        数组在内存中是连续存储的,因此可以通过索引快速访问任意位置的元素。
在某些情况下,如果数组的大小预先确定或增长预测准确,则可以使用较少的内存。


缺点:

        当队列在数组的一端进行插入(队尾)和删除(队头)操作时,如果数组已满或接近满,可能需要移动大量元素以维护队列的连续性,这会导致较高的时间复杂度(特别是删除操作)。
动态数组,虽然可以自动调整大小,但每次扩容都可能涉及大量元素的复制,这也可能带来性能问题。

使用链表实现队列
优点:

        链表的节点在内存中是动态分配的,不需要连续的存储空间,因此插入和删除操作只需要修改指针,时间复杂度为O(1)。
链表不需要像数组那样预留额外的空间以避免扩容操作,因此在动态数据结构中更加灵活。
缺点:

        链表中的每个节点都需要额外的空间来存储指针,这可能会增加内存消耗。
由于链表在内存中是分散的,所以遍历链表通常比遍历数组慢(尽管对于队列来说,这通常不是问题,因为队列的主要操作是插入和删除)

 因为对于队列来说,使用链表进行头删和尾插比较方便,所以我选择链表。当然顺序表也可以。

创建队列的结构

typedef struct QueueNode
{
	struct QueueNode* next;
	QDatatype data;
}QNode;

typedef struct queue
{
	QNode* head;
	QNode* tail;
	int size;
}queue;

首先创建一个结构体,结构体要连接,所以创建一个结构体指针,然后创建一个储存数据的类型( QDatatype),这个类型是typedef对int类型起的别名,若想更改储存数据类型,可以直接更改。

因为要进行先进先出,所以要找头和尾
所以创建了两个指针,多个数据用结构体创建

head表示创建的头节点

tail表示创建的尾节点

size表示存储的数字个数

队列的初始化

//进行初始化
void QueueInit(queue* pq)
{
	assert(pq);
	pq->tail = pq->head = NULL;
	pq->size = 0;
}

初始全赋值为NULL

存储的数字个数为0;

进行插入数据

//插入数据
void QueuePush(queue* pq, QDatatype x)
{
	assert(pq);
	QNode * newdata = (QNode *)malloc(sizeof(QNode));
	if (newdata==NULL)
	{
		perror("malloc");
		return;
	}
	if (pq->head == NULL)
	{
		assert(pq->tail==NULL);
		pq->tail = newdata;
		pq->head = newdata;
	}
	else
	{

		pq->tail->next = newdata;
		pq->tail = newdata;
	}
	newdata->next = NULL;
	newdata->data = x;
	pq->size++;
}

首先,要插入数据,就要进行开辟空间,这里使用的malloc进行开辟空间,如果开辟失败会进行打印错误并返回,

然后判断是否为第一个插入的数据,插入的第一个数据要进行处理;

如果不为空,尾节点向下进行互换;

size+1;

插入数据相当于是对链表的尾插

删除数据

//删除数据
void QueuePop(queue* pq)
{
	assert(pq);
	assert(pq->head);
	QNode* node = pq->head;
	if (pq->head == pq->tail)
	{	
		pq->tail = NULL;
		pq->head = NULL;
	}
	else
	{
		pq->head = pq->head->next;
	}
	pq->size--;
	free(node);
	node = NULL;
}

首先要判断删除数据前是否只剩下一个节点,如果为一个节点,则头尾节点全部置空;

如果不是,则头节点被下一个节点替换

计算个数

//计算个数
int QueueSize(queue* pq)
{
	assert(pq);
	return pq->size;
}

直接返回size即可

 判断是否为空

//判断是否为空
bool QueueEmpty(queue* pq)
{
	assert(pq);
	return pq->head == NULL;
}

返回队列头部数据

//对头数据
QDatatype QueueFront(queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->head->data;
}

返回队列尾部数据

//对尾数据
QDatatype QueueBack(queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->tail->data;
}

 

总体来说对应队列,比较容易理解,比较难理解的是他需要创建两个结构体,这个和之前的很不一样,一个拥有存放数据和连接,一个拥有记录数据。

代码连接

queue · 菠萝耿才宏/新数据结构 - 码云 - 开源中国 (gitee.com)icon-default.png?t=N7T8https://gitee.com/pineapple-geng-caihong/new-data-structure/tree/master/queue

标签:assert,head,pq,队列,链表,queue,实现,数据结构
From: https://blog.csdn.net/gengcaihong6666/article/details/140402124

相关文章

  • Bert实现情感分析demo
    Bert实现情感分析demo数据集IMDB数据集.代码以及部分讲解device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")没有cuda就启用cpuclassCustomClassifier(nn.Module):def__init__(self,bert):super(CustomClassifier,self).__init__()......
  • 记录---实现抖音 “视频无限滑动“效果
    ......
  • 用API实现商品sku抓取字段展示-淘宝sku区间价展示逻辑和规则分析
    有卖家问我:我的链接里面有5个sku,都是不同的价格,为什么消费者看到的不是最低价呢?这是因为淘宝平台商品价格的展示规则发生了变化,存在SKU区间价的产品,现在在搜索结果页面的曝光已经不是默认显示最低sku价了。现在平台展示逻辑主要有3点:①平台会结合着消费者的千人千面进行不......
  • ts vue3 element-plus 自建可配置表单弹窗实现
    当然可以!下面是使用TypeScript语法的动态表单弹出组件示例。1.创建动态表单弹出组件(TypeScript)<template><el-dialog:visible.sync="visible"title="表单"@close="handleClose"><el-form:model="formData":rules="rules"......
  • 使用Spring Boot实现消息队列
    使用SpringBoot实现消息队列大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代分布式系统中,消息队列是一个非常重要的组件。它可以解耦系统的各个部分,提高系统的可伸缩性和可靠性。本文将详细介绍如何使用SpringBoot实现消息队列,包括消息的发送和接......
  • PyQt5学习之路一:python与QT搭配,实现UI设计与业务逻辑层分离
    一、Python安装1.下载Pythonpython官网链接如下:链接:https://www.python.org/根据图中提示选择需要的python版本,下载并安装二、QT安装1.下载QTQt官网链接如下:链接:https://www.qt.io/下载社区版QT就可以三、PyQt5的安装1.PyQt5简介python语言最为排行第一的......
  • 泛微ECOLOGY9-如何实现明细第一行check框勾选禁用、浏览框内仅展示第一行相关的数据和
    实现效果:1.用户/业务需求以付款业务为例,明细表中添加多条同一个供应商的付款计划进行付款审批,审批后接口传入其他系统进行付款。2.需求分析审批完成后的接口仅支持接收一个账户相关的付款申请。明细表中浏览计划申请记录,以第一个行明细数据作为基准,并记录已选择的......
  • 全网最适合入门的面向对象编程教程:16 类和对象的Python实现-多态、方法重写与开闭原则
    全网最适合入门的面向对象编程教程:16类和对象的Python实现-多态、方法重写与开闭原则摘要:本文主要介绍了Python中创建自定义类时子类如何实现对父类方法的重写、方法重写的定义和多态的基本概念,并对开闭原则进行介绍。原文链接:FreakStudio的博客往期推荐:学嵌入式的你,......
  • 【华为OD】D卷真题100分:阿里巴巴找黄金宝箱(III) python代码实现[思路+代码]
    【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客Java、JS、python、C、C++代码实现:【华为OD】D卷真题100分:阿里巴巴找黄金宝箱(III)Java代码实现[思路+代......
  • 【java登录锁定功能】redis实现登录失败锁定账号
    登录失败(账号密码<5次时不提示),>=5次时,锁定时间5min,最高密码错误次数为10,第十次密码输入错误后,提醒,“账号已停用,请联系管理员开通”,次日0时,重新计算错误次数代码实现publicstaticStringLOGIN_FAIL_LOCK="login:error:count:";publicstaticStringLOGIN......