[数据结构 -- C语言] 队列(Queue)

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

目录

1、队列

1.1 队列的概念及结构

2、队列的实现

2.1 接口

3、接口的实现

3.1 初始化队列

3.2 队尾入队列

分析:

3.3 队头出队列

分析:

3.4 获取队列头部元素

3.5 获取队列尾部元素

3.6 获取队列中有效元素个数

3.7 检测队列是否为空

3.7.1 int 类型判空

3.7.2 bool 类型判空

3.8 销毁队列

4、完整代码

5、效果展示


1、队列

1.1 队列的概念及结构

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

[数据结构 -- C语言] 队列(Queue)

2、队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数
组头上出数据,效率会比较低。本篇文章就是用链表实现队列。

2.1 接口

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
// 链式结构:表示队列 
typedef int QDataType;
typedef struct QListNode
{
	struct QListNode* next;
	QDataType data;
}QNode;

// 队列的结构 
typedef struct Queue
{
	QNode* front;
	QNode* rear;
	int size;
}Queue;

// 初始化队列 
void QueueInit(Queue* q);
// 队尾入队列 
void QueuePush(Queue* q, QDataType data);
// 队头出队列 
void QueuePop(Queue* q);
// 获取队列头部元素 
QDataType QueueFront(Queue* q);
// 获取队列队尾元素 
QDataType QueueBack(Queue* q);
// 获取队列中有效元素个数 
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* q);
// 销毁队列 
void QueueDestroy(Queue* q);

3、接口的实现

3.1 初始化队列

我们将队头指针与队尾指针都置为 NULL,并将队列的大小赋值为 0。

void QueueInit(Queue* q)
{
	assert(q);

	q->front = NULL;
	q->rear = NULL;	
	q->size = 0;
}

3.2 队尾入队列

void QueuePush(Queue* q, QDataType data)
{
	assert(q);

	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail:");
		return;
	}
	newnode->data = data;
	newnode->next = NULL;

	if (q->rear == NULL)
	{
		assert(q->front == NULL);

		q->front = q->rear = newnode;
	}
	else
	{
		q->rear->next = newnode;
		q->rear = newnode;
	}
	q->size++;
}

分析:

我们是以链表实现队列的,所以每次入队的时候我们都要 malloc 一个 newnode 结点出来,将 newnode->data = data,newnode->next = NULL。

下来就是连接了:

我们要考虑这个结点是否是队列的第一个结点。

1、是队列的第一个结点的话,我们让头尾指针都指向这个结点(q->front = q->rear = newnode);

2、不是队列的第一个结点,我们将尾指针的next赋值为新节点(q->rear->next = newnode;), 再让尾指针指向新节点( q->rear = newnode;);

3、让队列的 size++。

3.3 队头出队列

void QueuePop(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));

	//1.一个结点
	if (q->front->next == NULL)
	{
		free(q->front);
		q->front = q->rear = NULL;
	}
	else//2.多个结点
	{
		QNode* next = q->front->next;
		free(q->front);
		q->front = next;
	}
	q->size--;
}

分析:

出队的时候要考虑队列是否是一个结点:

1、队列中只有一个结点,我们将这一个结点释放掉后(free(q->front)),将头、尾指针都置空(q->front = q->rear = NULL);

2、队列中有多个结点,那我们就将队头的下一个结点先保存起来(next = q->front->next),然后将队头释放掉(free(q->front)),最后让队头指向释放前队头的下一个结点(q->front = next);

3、最后让队列的 size--。

3.4 获取队列头部元素

取队头元素时,我们先要对队列进行判空,如果队列为空,那就不存在队头元素。

QDataType QueueFront(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));

	return q->front->data;
}

3.5 获取队列尾部元素

取队尾元素时,我们先要对队列进行判空,如果队列为空,那就不存在队尾元素。

QDataType QueueBack(Queue* q)
{
	assert(q);
	assert(!QueueEmpty(q));

	return q->rear->data;
}

3.6 获取队列中有效元素个数

我们在创建队列的结构体时,在里面创建了一个变量 size,它专门记录队列中的元素个数,所以在这我们只要返回 q->size就可以了。如果没有定义 size 变量的话,我们遍历一遍队列,用计数器来统计一下个数也是可以的。

int QueueSize(Queue* q)
{
	assert(q);

	return q->size;
}

3.7 检测队列是否为空

3.7.1 int 类型接口

这里我们约定,为空返回非 0,非空返回 0。

int QueueEmpty(Queue* q)
{
	assert(q);

	if (0 == q->size)
		return 1;
	else
		return 0;
}

3.7.2 bool 类型接口

直接判断队头是否为空,队头为空队列就是空。

bool QueueEmpty(Queue* q)
{
	assert(q);

	return q->front == NULL;
}

3.8 销毁队列

销毁我们已经写的很多了,这就直接拿捏。我们先将单链表进行释放,这里有一个注意点,我们要先记下下一个位置,然后释放当前位置,然后将下个位置再交给当前位置来迭代。最后将头、尾指针置空,再将 size 置0。

void QueueDestroy(Queue* q)
{
	assert(q);

	QNode* cur = q->front;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	q->front = q->rear = NULL;
	q->size = 0;
}

4、完整代码

完整代码在代码仓库,入口:C语言: C语言学习的代码,多复习 - Gitee.com

5、效果展示

[数据结构 -- C语言] 队列(Queue)

[数据结构 -- C语言] 队列(Queue)文章来源地址https://www.toymoban.com/news/detail-467525.html

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

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

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

相关文章

  • 爱上数据结构:栈和队列的概念及使用

    ​ ​ 🔥个人主页 : guoguoqiang. 🔥 专栏 : 数据结构 ​ 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作

    2024年04月16日
    浏览(31)
  • 【Golang】实现简单队列(Queue)数据结构

     在计算机科学中,队列是一种特殊的线性数据结构,它遵循FIFO(先进先出)原则。队列中的元素只能从一端(称为队尾或后端)添加,并且只能从另一端(称为队头或前端)移除。这种特性使得队列在许多算法和数据结构中都有广泛的应用,例如操作系统中的任务调度、网

    2024年01月19日
    浏览(39)
  • Java 数据结构之队列(Queue)详解

    目录 1、在Java中有哪些常见的队列? 2、Queue 接口分析 3、Deque 接口分析 4、PriorityQueue 的实现原理详解 5、使用Java数组实现队列的简单示例 1、在Java中有哪些常见的队列?         在Java中,有一些常见的队列实现。下面是其中一些的列举: //队列也是一种线性的数据结构

    2024年02月15日
    浏览(40)
  • 队列(Queue):先进先出(FIFO)的数据结构

    队列是一种基本的数据结构,用于在计算机科学和编程中管理数据的存储和访问。队列遵循先进先出(First In, First Out,FIFO)原则,即最早入队的元素首先出队。这种数据结构模拟了物理世界中的队列,如排队等待服务的人。 在本篇博客中,我们将详细介绍队列的概念、用途

    2024年02月05日
    浏览(46)
  • 【数据结构与算法】7、队列(Queue)的实现【用栈实现队列】

    ☘️ 队列 (Queue)是一种特殊的 线性表 , 只能在头尾两端进行操作 🎁 队尾(rear):只能从 队尾添加 元素,一般叫做 enQueue , 入队 🎁 队头(front):只能从 队头移除 元素,一般叫做 deQueue , 出队 🎁 先进先出 的原则, F irst I n F irst O ut, FIFO ☘️ 队列内部的实现可

    2024年02月12日
    浏览(43)
  • 【数据结构】栈和队列超详解!(Stack && Queue)

    栈 :一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则 压栈 : 栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈 : 栈的删除操

    2024年02月04日
    浏览(43)
  • 数据结构入门到入土——栈(Stack)和队列(Queue)

    目录 一,栈(Stack) 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1.5 栈,虚拟机栈,栈帧有什么区别? 二,队列(Queue) 2.1 概念 2.2 队列的使用  2.3 队列模拟实现 2.4 循环队列 三,双端队列 栈 :一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操

    2024年02月02日
    浏览(54)
  • Java 【数据结构】 栈(Stack)和队列(Queue)【神装】

      登神长阶  第三神装 S tack    第四神装 Queue    目录 🔋一.栈 Stack 💻1.概念 🖥️2.基本操作  🖨️3.相关OJ题   🖱️4.栈、虚拟机栈和栈帧的区别 🪫二.队列 Queue 🖲️1.概念 💽2.基本操作 🔌三.总结与反思         在 Java 中,栈(Stack)是一种后进先出(LIFO)的数

    2024年04月27日
    浏览(36)
  • 数据结构入门(C语言版)二叉树概念及结构(入门)

    1.1 树的概念 树是一种非线性的数据结构,它是由n(n=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 ☆有一个特殊的结点,称为根结点,根节点没有前驱结点 ☆除根节点外,其余结点被分成M

    2023年04月14日
    浏览(42)
  • 数据结构入门(C语言版)二叉树的顺序结构及堆的概念及结构实现应用

    普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用 顺序结构的数组来存储 ,需要注意的是 这里的堆和操作系统虚拟进程地址空间中的堆是两回事 ,一个是 数据结构 ,一

    2023年04月19日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包