数据结构 队列(一篇基本掌握)

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


绪论

        任其事必图其效;欲责其效,必尽其方。——欧阳修;本篇文章主要写的是什么是队列、以及队列是由什么组成的和这些组成接口的代码实现过程。(大多细节的实现过程以注释的方式展示请注意查看

c语言实现队列,数据结构,数据结构

 文章来源地址https://www.toymoban.com/news/detail-658727.html

 话不多说安全带系好,发车啦(建议电脑观看)


附:红色,部分为重点部分;蓝颜色为需要记忆的部分(不是死记硬背哈,多敲);黑色加粗或者其余颜色为次重点;黑色为描述需要


目录

队列

1.队列的实现​编辑

1.1队列的结构

1.2队列的初始化

1.3将数据放进队列中

1.4删除数据

1.5查看队列中是否有数据

1.6查看队列中的头尾数据

1.7查看队列中有几个元素

1.8队列的摧毁

2.队列的实现代码


队列

知识点:

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

入队列:进行插入操作的一端称为队尾 、出队列:进行删除操作的一端称为队头c语言实现队列,数据结构,数据结构

细节:

队列的基本结构框架:同样队列也是既能由顺序表也能由链表来实现的,下面将用链表来实现(因为链表相较于顺序表来说,其头删的效率比较高)

  1. 队列的结构
    1. 指向链表头的指针
    2. 指向链表尾的指针
    3. 记录链表元素个数的变量
  2. 队列所要实现的功能
    1. 队列的初始化
    2. 队列的摧毁
    3. 放入数据
    4. 删除数据
    5. 查看队列是否为空
    6. 获取头部、尾部的数据
    7. 查看队列中有几个元素

1.队列的实现

1.1队列的结构

因为队列是由链表来实现所以先要有一个链表,然后队列中的结构由指向链表的头和尾的指针以及一个记录链表中有多少数据的变量。

所以我们就分成两个结构体的形式:一个结构体实现单链表,一个结构体是队列的结构queue。

typedef int QDataType;

typedef struct QListNode
{
	struct QListNode* _pNext;//指向下一个
	QDataType _data;//数据
}QNode;

typedef struct Queue
{
	QNode * _front;//指向头
	QNode* _rear;//尾
	int _size;//记录有几个数据
}Queue;

1.2队列的初始化

初始化一下队列,把队列中的两个指针已经记录数据个数的变量初始化

void QueueInit(Queue* q)//用指针接收结构
{
	assert(q);//判空
	q->_front = q->_rear = NULL;//连续赋值将两个指针都先赋值成空指针
	q->_size = 0;//一开始元素个数为0
}

1.3将数据放进队列中

将数据放进队列中,其实原理类似实现链表的尾插,不同于主要是通过rear来找到尾,然后直接进行数据的插入(当rear为NULL时表示队列中是没有数据的)

void QueuePush(Queue* q, QDataType data)
{
	assert(q);
	QNode* pf = (QNode*)malloc(sizeof(QNode));//先申请一个链表节点空间
	if (pf == NULL)//判断是否申请成功
	{
		perror("malloc");
		return;
	}
	//判断第一个节点是否存在(队列中没有数据的时候rear是NULL)
	if (q->_rear)//若不为NULL
	{
		q->_rear->_pNext = pf;//进行尾插,也就是在最后一个节点后面插入新生成的节点pf
		q->_rear = pf;//再把尾部修改一下
	}
	else//当队列中没有数据的时候
	{
		//此时把头和尾指针都指向pf这样就创建好链表的开始了
		q->_rear = pf;
		q->_front = pf;
	}
	q->_rear->_data = data;//将rear指向后,将尾部的数据填充为所给的data
	q->_rear->_pNext = NULL;//再将尾部指针的下一个位置置成NULL
	q->_size++;//元素个数++
}

1.4删除数据

删除数据就相当于链表的头删,通过front找到头进行释放,然后再改变一下front头,注意队列中是否有数据

void QueuePop(Queue* q)
{
	assert(q);//判空
	assert(!QueueEmpty(q));//查看队列中是否有数据
	QNode* tmp = q->_front->_pNext;//用tmp记录一下第二个位置的数据的地址
	if (q->_front == q->_rear)//判断一下是否为最后一个元素
	{
		free(q->_front);//释放头指向的空间
		//若是则直接吧rear和front都置为NULL
		q->_front = q->_rear = NULL;
	}
	else//反之当不止只有一个数据时
	{
		free(q->_front);//同样是否头位置的空间

		q->_front = tmp;//改变一下头位置然其指向第二个数据的位置也就是新头
	}
	q->_size--;//元素减少一位
}

1.5查看队列中是否有数据

直接查看一下size即可

bool QueueEmpty(Queue* q)
{
	assert(q);//判空
	return q->_size == 0;//查看size是否为0,若为则返回真(1)反之则为假(0)
}

1.6查看队列中的头尾数据

直接返回各指针指向空间的数据,注意要判断一下是否为空(否则可能会访问到NULL)

QDataType QueueFront(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));//判断队列是否有数据
	return q->_front->_data;//返回头位置的数据
}

QDataType QueueBack(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));//判断队列是否有数据
	return q->_rear->_data;//返回尾位置的数据
}

1.7查看队列中有几个元素

直接返回队列结构体中的size即可


int QueueSize(Queue* q)
{
	return q->_size;//返回size即可
}

1.8队列的摧毁

队列的摧毁和链表的摧毁几乎一样

void QueueDestroy(Queue* q)
{
	assert(q);
	//从前往后的进行各链表节点释放
	while (q->_front)//判断头是否为空
	{
		QNode* next = q->_front->_pNext;//用next记录下一个位置的地址(防止找不到)
		free(q->_front);//释放当前位置
		q->_front = next;//让front指向下一个位置
	}
	q->_front = q->_rear = NULL;//链表数据全部释放完后把front/rear也置为NULL
	q->_size = 0;//把size置为0
}

2.队列的实现代码

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>


typedef int QDataType;

typedef struct QListNode
{
	struct QListNode* _pNext;//指向下一个
	QDataType _data;//数据
}QNode;

typedef struct Queue
{
	QNode * _front;//头
	QNode* _rear;//尾
	int _size;
}Queue;




void QueueInit(Queue* q)
{
	assert(q);
	q->_front = q->_rear = NULL;
	q->_size = 0;
}

void QueuePush(Queue* q, QDataType data)
{
	assert(q);
	QNode* pf = (QNode*)malloc(sizeof(QNode));//先申请一个链表节点空间
	if (pf == NULL)//判断是否申请成功
	{
		perror("malloc");
		return;
	}
	//判断第一个节点是否存在(队列中没有数据的时候rear是NULL)
	if (q->_rear)//若不为NULL
	{
		q->_rear->_pNext = pf;//进行尾插,也就是在最后一个节点后面插入新生成的节点pf
		q->_rear = pf;//再把尾部修改一下
	}
	else//当队列中没有数据的时候
	{
		//此时把头和尾指针都指向pf这样就创建好链表的开始了
		q->_rear = pf;
		q->_front = pf;
	}
	q->_rear->_data = data;//将rear指向后,将尾部的数据填充为所给的data
	q->_rear->_pNext = NULL;//再将尾部指针的下一个位置置成NULL
	q->_size++;//元素个数++
}

bool QueueEmpty(Queue* q)
{
	assert(q);
	return q->_size == 0;//查看size是否为0,若为则返回真(1)反之则为假(0)
}
void QueuePop(Queue* q)
{
	assert(q);//判空
	assert(!QueueEmpty(q));//查看队列中是否有数据
	QNode* tmp = q->_front->_pNext;//用tmp记录一下第二个位置的数据的地址
	if (q->_front == q->_rear)//判断一下是否为最后一个元素
	{
		free(q->_front);//释放头指向的空间
		//若是则直接吧rear和front都置为NULL
		q->_front = q->_rear = NULL;
	}
	else//反之当不止只有一个数据时
	{
		free(q->_front);//同样是否头位置的空间

		q->_front = tmp;//改变一下头位置然其指向第二个数据的位置也就是新头
	}
	q->_size--;//元素减少一位
}

QDataType QueueFront(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));//判断队列是否有数据
	return q->_front->_data;//返回头位置的数据
}

QDataType QueueBack(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));//判断队列是否有数据
	return q->_rear->_data;//返回尾位置的数据
}

int QueueSize(Queue* q)
{
	return q->_size;//返回size即可
}

void QueueDestroy(Queue* q)
{
	assert(q);
	//从前往后的进行各链表节点释放
	while (q->_front)//判断头是否为空
	{
		QNode* next = q->_front->_pNext;//用next记录下一个位置的地址(防止找不到)
		free(q->_front);//释放当前位置
		q->_front = next;//让front指向下一个位置
	}
	q->_front = q->_rear = NULL;//链表数据全部释放完后把front/rear也置为NULL
	q->_size = 0;//把size置为0
}

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量数据结构细致内容,早关注不迷路。

 

 

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

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

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

相关文章

  • 数据结构(C语言实现)——栈和队列的介绍及基本操作的实现(动态顺序栈+链队)

    今天我们来学习另外两个线性结构——栈和队列,栈和队列是操作受限的线性表,因此,可称为限定性的数据结构。 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守

    2023年04月19日
    浏览(41)
  • 数据结构--队列的基本概念

    队列其实是一种受限制的线性表 队列(Queue):是 只允许在一端进行插入或删除操作 color{red}只允许在一端进行插入或删除操作 只允许在一端进行插入或删除操作 的线性表 重要术语: 队头、队尾、空队列 队列的特点: 先进先出 color{green}先进先出 先进先出 First In First Out ( F l

    2024年02月11日
    浏览(45)
  • 数据结构 队列(基本入队,出队)

    队列是一种操作受限的线性表,队列只允许在表的一端进行插入,在表的另一端进行删除。可进行插入的一段称为队尾,可进行删除的一端称为队头。 队列的主要特点就是先进先出。依照存储结构可分为:顺序队和链式队。          1. 队列为一种特殊的线性表,        

    2024年02月06日
    浏览(30)
  • (数据结构)链队列的基本操作

    2024年02月08日
    浏览(41)
  • 速学数据结构 | 用队列实现栈你都被难住了?那是你没掌握好技巧

    🎬 鸽芷咕 :个人主页  🔥个人专栏 :《Linux深造日志》《C++干货基地》 ⛺️生活的理想,就是为了理想的生活!    🌈 hello! 各位铁铁们大家好啊,栈和队列我们都学过了那么试试用队列实现栈你会嘛?。    ⛳️ 本篇文章就来给大家来篇如何用队列来实现栈的全部解

    2024年02月05日
    浏览(47)
  • 数据结构——队列(C语言)

    本篇文章将解决一下几个问题: 队列是什么? 如何实现一个队列? 什么场景下会用队列? 队列:一种只允许一端进行插入数据操作,在另一端进行删除操作的特殊线性表。队列具有先进先出(FIFO)入队列:进行插入操作的一端称为队尾,出队列的一端叫做队头。  队列也

    2024年02月11日
    浏览(42)
  • 数据结构——队列(C语言实现)

    队列是一种特殊的线性结构,数据只能在一端插入,数据也只能在另一端进行删除。插入数据的那一端称之为队尾,插入数据的动作称之为入队。删除数据的那一端称之为队头,删除数据的动作称之为出列。队列遵守的是FIFO原则(Frist In First Out),即先进先出原则。 队列具

    2024年02月03日
    浏览(78)
  • 数据结构 队列(C语言实现)

            任其事必图其效;欲责其效,必尽其方。——欧阳修;本篇文章主要写的是什么是队列、以及队列是由什么组成的和这些组成接口的代码实现过程。( 大多细节的实现过程以注释的方式展示请注意查看 )    话不多说安全带系好,发车啦 (建议电脑观看) 。 附

    2024年02月11日
    浏览(53)
  • 队列--C语言实现数据结构

    本期带大家一起用C语言实现队列🌈🌈🌈 队列是一种线性数据结构,它按照先进先出(FIFO)的原则进行操作。可以把队列想象成排队买票或者排队上公交车的队伍。 顺序队列 由一个连续的内存区域组成,可以存储多个元素。队列有两个指针,分别指向队头(Front)和队尾(

    2024年02月16日
    浏览(36)
  • 数据结构:队列(Python语言实现)

    队列是一种 先进先出 的数据结构(特殊的线性结构),在队列 尾部 插入新元素,在队列 头部 删除元素。 一般队列的基本操作如下: create:创建空队列。 enqueue:将新元素加入队列的尾部,返回新队列。 dequeue:删除队列头部元素,返回新队列。 front:返回队列头部的元素

    2024年02月13日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包