数据结构---队列的实现

这篇具有很好参考价值的文章主要介绍了数据结构---队列的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章目录

  • 前言
  • 一、什么是队列?
  • 二、队列接口的实现
    • 1.队列结构的定义
    • 2.接口实现
  • 总结

前言

队列是一种特殊的线性表。

特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。

进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列中没有元素时,称为空队列。

队列的数据元素又称为队列元素。

在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。

因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表


一、什么是队列?

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。

队列具有先进先出FIFO(First In First Out)

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

数据结构---队列的实现

 

二、队列接口的实现

1.队列结构的定义

//队列--先进先出--用链表实现
typedef int QDataType;

//队列的单节点定义
typedef struct QNode
{
	QDataType val;
	struct QNode* next;
}QNode;

//队列整体定义,有头,尾,以及元素个数
typedef struct Queue
{
	QNode* head;
	QNode* tail;
	int size;
}Queue;

原因:队列使用链表实现,使其每个节点的定义为链表节点形式,而因为队列是一个线性结构,需要有头尾节点进行访问,而且还需要返回其元素个数,便于某些特定场合下的访问,需要将其封装到结构体中,便于访问,因而定义两个结构体形式。

2.接口实现

1. 初始化

//初始化
void QInit(Queue* pq)
{
	assert(pq);
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

为什么加断言?

可以明确的知道,pq指针不为空,则需要进行断言,避免他人传错参数。

2. 销毁

//销毁
void QDestroy(Queue* pq)
{
	//空队列没必要销毁
	assert(pq);
	assert(pq->head != NULL);
	//依次进行释放
	QNode* cur = pq->head;
	while (cur)
	{
		QNode* after = cur->next;
		free(cur);
		cur = after;
	}
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

因为是从堆上动态开辟出来的节点,需要依次释放,避免一次性释放,无法找到剩下的节点,导致出现内存泄漏。

3. 插入(入队)

//插入--入队列
void QPush(Queue* pq, QDataType x)
{
	assert(pq);

	//开辟一个新的节点
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->next = NULL;
	newnode->val = x;
	//链接--尾插
	if (pq->head == NULL)
	{
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
	pq->size++;
}

入队过程:1.进行新节点的开辟,需要对malloc的结果进行检查,有备无患

2.有了新节点,需要进行链接过程,链接过程中,需要进行对于队列头尾指针的检查,避免出现非法访问的情况,因为在初始化过程,对于head和tail是赋为空指针的

3.检查完是否为空指针后,即开始链接,也就是进行普通的尾插过程。

4. 删除(出队列)

//删除--出队列
void QPop(Queue* pq)
{
	assert(pq);
	assert(pq->head != NULL);
	//因为队列的性质,先进先出,则其删除是头删
	QNode* after = pq->head->next;
	free(pq->head);
	pq->head = after;
	pq->size--;
}

出队列过程:普通的头删即可,但是,需要注意的是空队列无需删除,需要对head进行判断,否则会出现非法访问情况

5. 获取元素个数

//返回队列元素个数
int QSize(Queue* pq)
{
	assert(pq);
	return pq->size;
}

很普通的操作,但是在某些特定的环境下,可以发挥出神奇的效果,可以使得获取元素效率很快

6. 获取队头和队尾元素及判空

//判空
bool QEmpty(Queue* pq)
{
	assert(pq);
	return pq->size == 0;
}

//取队头元素
QDataType QFront(Queue* pq)
{
	assert(pq);
	//空队列不用取元素
	assert(!QEmpty(pq));
	return pq->head->val;

}

//取队尾元素
QDataType QRear(Queue* pq)
{
	assert(pq);
	//空队列不用取元素
	assert(!QEmpty(pq));
	return pq->tail->val;
}

判空和获取队头队尾元素配合使用,因为空的队列无法获取元素


总结

队列,数据结构中的特殊结构,具有先进先出的特性,使得在某些场合会被频繁利用,所以对于身为学习者的我们,需要掌握其实现逻辑和实现方法。文章来源地址https://www.toymoban.com/news/detail-430996.html

到了这里,关于数据结构---队列的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构——队列的实现

    队列 ,又称为伫列(queue),计算机科学中的一种抽象资料类型,是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。 这段代码使用 typedef 定义了一个

    2024年02月10日
    浏览(35)
  • 数据结构/队列实现栈

    在学习数据结构的过程当中,我们会学到栈和队列,在本篇文章中,重点讲解的是队列实现栈,在上篇文章中已经简单介绍过栈和队列的使用说明,以及栈实现队列。(2条消息) 数据结构/栈实现队列_Y君的进化史的博客-CSDN博客 关于一个队列的简单使用方式:    关于一个栈的

    2024年02月02日
    浏览(40)
  • 数据结构队列的实现

    本章介绍数据结构队列的内容,我们会从队列的定义以及使用和OJ题来了解队列,话不多说,我们来实现吧 队列 1。队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入

    2024年02月11日
    浏览(61)
  • 【数据结构】:队列的实现

    队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如

    2024年02月07日
    浏览(36)
  • 【数据结构—队列的实现】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、队列 1.1队列的概念及结构 二、队列的实现 2.1头文件的实现—Queue.h 2.2源文件的实现—Queue.c 2.3源文件的测试—test.c 三、测试队列实际数据的展示 3.1正常队列的出入 3.2入队列的同时存

    2024年02月04日
    浏览(40)
  • 数据结构---队列的实现

    前言 一、什么是队列? 二、 队列接口的实现 1. 队列结构的定义 2. 接口实现 总结 队列是一种特殊的线性表。 特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。 进行插入操作的端称为

    2024年02月02日
    浏览(33)
  • 数据结构—队列的实现

    前言:上次我们已经学习了数据结构中一个重要的线性表—栈,那么我们这一次就来学习另外一个重要的线性表—队列。 一、 队列的概念 二、 队列的实现: 1.队列的创建 三、 队列的操作 1.初始化队列 2.队尾入队列 3.队头出队列 4.获取队列头部元素 5.获取队列队尾元素 6.获

    2024年02月04日
    浏览(36)
  • 【数据结构】队列及其实现

    目录 😎前言 认识队列 队列的初始化 队列判空 数据队尾入队 数据队头出队 取队头数据 取队尾数据 队列数据的个数 队列销毁 总结 上次我们学习了栈及其实现,当然也少不它的好兄弟队列啦,今天我们开始队列的学习 队列的性质是 先进先出 ,就比如车辆进出隧道一般,它

    2024年02月09日
    浏览(43)
  • 数据结构 | 队列的实现

    队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如

    2024年02月05日
    浏览(41)
  • 【数据结构】队列的实现

    队列是一种常用的数据结构,也是一种操作受限制的线性表,特点是只允许在表的头部进行删除操作,在表的尾部进行插入操作,队列具有先进先出FIFO(First In First Out)。 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 我们实现可以用数组和链表

    2024年02月02日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包