当前位置: 首页 > news >正文

数据结构——队列的实现

目录

队列的概念和结构

 队列的实现

队列初始化

 入队操作

出队操作

取队头的元素 

判断队列是否为空

队列的销毁


队列的概念和结构

队列:只允许在一端进行插入数据操作,另一端进行删除数据操作的特殊线性结构,具有“先进先出”的特点,进行插入数据的一端称为队尾,出数据的一端称为队头。

 队列的实现

队列的实现还是建立三个文件,一个头文件,两个源文件。

typedef int QueDateType;

typedef struct SList {
	struct SList* next;
	QueDateType date;
}SL;

typedef struct Queue {
	SL* head;
	SL* tail;
	int size;
}Queue;

 创建两个结构体,队列的实现是用链表来实现的,如果使用数组来实现,那么效率就太低了,在进行数据删除时,需要挪动数据,在链表中删除数据就是头删,插入数据就是尾插,效率远比使用数组实现高效。

SList是一个节点,成员next 存储下一个节点的地址,date存储该节点的数据,Queue结构体包含两个节点指针,一个指向头,一个指针尾,还有size来统计节点个数。

队列初始化

函数声明

void QueInit(Queue* p);

函数定义

void QueInit(Queue* p)
{
	assert(p);
	p->head = p->tail = NULL;
	p->size = 0;
}

初始化队列,没有节点需要将头指针和尾指针置空,size置为0。

 入队操作

函数声明

void QuePush(Queue* p, QueDateType x);

函数定义

void QuePush(Queue* p, QueDateType x)
{
	assert(p);
	SL* newnode = (SL*)malloc(sizeof(SL));
	if (newnode == NULL)
	{
		perror("QuePush:malloc");
		return;
	}
	newnode->date = x;
	newnode->next = NULL;
	if (p->size == 0)
	{
		p->head = p->tail = newnode;
	}
	else
	{
		p->tail->next = newnode;
		p->tail = newnode;
	}
	p->size++;
}

队列的入队操作,根据队列“先进先出”特点,所以我们插入数据在尾部。

先对结构体指针断言,用malloc函数申请一片空间来存储一个节点,这时就有两种情况,一个是队列为空,和队列不为空。当队列为空时,头指针和为尾指针都指向新开辟的节点,当队列不为空,就只需要改变尾指针就可以,最后size++。

出队操作

函数声明

void QuePop(Queue* p);

函数定义

void QuePop(Queue* p)
{
	assert(p);
	assert(p->head != NULL);
	SL* next = p->head->next;
	free(p->head);
	p->head = NULL;
	p->head = next;
	p->size--;
}

出队操作不能一直执行,当队列为空时不可执行,因此对其断言,头指针不可以为空。定义一个节点指针来保存头指针的下一个节点的地址,这样释放头指针后还可以找到下一个节点,最后size--。

取队头的元素 

函数声明

QueDateType QueTop(Queue* p);

函数定义

QueDateType QueTop(Queue* p)
{
	assert(p);
	assert(!QueJuS(p));
	return p->head->date;
}

除了对结构体判空,还需要对节点个数断言,没有节点就不进行该操作,反之返回队头元素。 

判断队列是否为空

 函数声明

bool QueJuS(Queue* p);

函数定义

bool QueJuS(Queue* p)
{
	assert(p);
	return p->size == 0;
}

该函数返回类型为布尔类型,当size等于0时返回true,反之返回false。 

队列的销毁

函数声明

void QueDestroy(Queue* p);

函数定义

void QueDestroy(Queue* p)
{
	assert(p);
	SL* cur = p->head;
	while (cur)
	{
		SL* next = cur->next;
		free(cur);
		cur = next;
	}
	p->size = 0;
}

每插入一个节点就需要进行malloc,所以销毁队列时需要对每一个节点进行空间释放,最后size置为0。 

 

 

 

 

 

 

http://www.dtcms.com/a/106657.html

相关文章:

  • LeetCode算法题(Go语言实现)_26
  • LLM大模型之精度问题(FP16,FP32,BF16)详解与实践
  • Mapreduce的使用
  • 深入理解归并排序:分治艺术的经典实践
  • 【AI产品分享】面向图片的原始位置翻译功能
  • Redisson中BitMap位图的基本操作
  • CORS与OPTIONS请求
  • 蓝桥杯 游戏 6251 单调队列
  • .NET 创建MCP使用大模型对话
  • 【计网速通】计算机网络核心知识点与高频考点——数据链路层(二)
  • kafka消息可靠性传输语义
  • 大语言模型开发框架——LangChain
  • 使用PyTorch实现LeNet-5并在Fashion-MNIST数据集上训练
  • 【Linux】内核驱动学习笔记(二)
  • 基于Spring AI与Ollama构建本地DeepSeek对话机器人
  • 数据库分库分表中间件及对比
  • ensp 网络模拟器 思科华为基于VLANIF的公司网络搭建
  • 2025.4.2总结
  • Go语言GC:三色标记法工程启示|Go语言进阶(3)
  • K-means算法
  • 从零搭建微服务项目Pro(第7-1章——分布式雪花算法)
  • cmake(11):list 选项 排序 SORT,定义宏 add_definitions,cmake 里预定义的 8 个宏
  • Git 命令大全:通俗易懂的指南
  • 基于大模型预测风湿性心脏病二尖瓣病变的多维度诊疗研究报告
  • 内网隔离环境下Java实现图片预览的三大解决方案
  • 【Django开发】前后端分离django美多商城项目第15篇:商品搜索,1. Haystack介绍和安装配置【附代码文档】
  • 从 ZStack 获取物理机与云主机信息并导出 Excel 文件
  • visual studio 2022的windows驱动开发
  • C# System.Text.Json 中 JsonIgnoreCondition 使用详解
  • Linux2 CD LL hostnamectl type mkdir dudo