数据结构——队列的实现

目录

队列的概念和结构

队列的实现

队列初始化

入队操作

出队操作

取队头的元素

判断队列是否为空

队列的销毁


队列的概念和结构

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

队列的实现

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

cs 复制代码
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来统计节点个数。

队列初始化

函数声明

cs 复制代码
void QueInit(Queue* p);

函数定义

cs 复制代码
void QueInit(Queue* p)
{
	assert(p);
	p->head = p->tail = NULL;
	p->size = 0;
}

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

入队操作

函数声明

cs 复制代码
void QuePush(Queue* p, QueDateType x);

函数定义

cs 复制代码
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++。

出队操作

函数声明

cs 复制代码
void QuePop(Queue* p);

函数定义

cs 复制代码
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--。

取队头的元素

函数声明

cs 复制代码
QueDateType QueTop(Queue* p);

函数定义

cs 复制代码
QueDateType QueTop(Queue* p)
{
	assert(p);
	assert(!QueJuS(p));
	return p->head->date;
}

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

判断队列是否为空

函数声明

cs 复制代码
bool QueJuS(Queue* p);

函数定义

cs 复制代码
bool QueJuS(Queue* p)
{
	assert(p);
	return p->size == 0;
}

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

队列的销毁

函数声明

cs 复制代码
void QueDestroy(Queue* p);

函数定义

cs 复制代码
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。

相关推荐
KarrySmile26 分钟前
Day17--二叉树--654. 最大二叉树,617. 合并二叉树,700. 二叉搜索树中的搜索,98. 验证二叉搜索树
数据结构·算法·二叉树·二叉搜索树·合并二叉树·最大二叉树·验证二叉搜索树
凤年徐28 分钟前
【数据结构与算法】21.合并两个有序链表(LeetCode)
c语言·数据结构·c++·笔记·算法·链表
程序员老冯头36 分钟前
第三十二节 MATLAB函数
数据结构·算法·matlab
lifallen41 分钟前
hadoop.yarn 带时间的LRU 延迟删除
java·大数据·数据结构·hadoop·分布式·算法
摸鱼仙人~5 小时前
Redis 数据结构全景解析
数据结构·数据库·redis
玄月初二丶12 小时前
28. 找出字符串中第一个匹配项的下标
c语言·开发语言·数据结构·算法
屁股割了还要学13 小时前
【数据结构入门】时间、空间复杂度的计算
c语言·开发语言·数据结构·c++·算法
秋难降15 小时前
栈:从基础概念到实战解题(详细)
数据结构·算法·排序算法
归云鹤15 小时前
QT信号和槽怎么传输自己定义的数据结构
开发语言·数据结构·qt
Shun_Tianyou18 小时前
Python Day17 面向对象 及例题分析
开发语言·数据结构·python·算法