【C语言】实现队列


目录

(一)队列

(二)头文件

[(三) 功能实现](#(三) 功能实现)

(1)初始化

[(2) 销毁队列](#(2) 销毁队列)

[(3) 入队](#(3) 入队)

(4)出队

(5)得到队头的数据

(6)得到队尾的数据

(7)判断队列是否为空

(8)得到队列内数据个数


正文开始:

(一)队列

队列是一种数据结构,其中元素按照先进先出(FIFO)的顺序进行操作。在队列中,新元素被插入到队列的尾部,而删除元素发生在队列的头部。

队列可以用于处理任务或事件的顺序,例如处理请求、消息传递等。可以将任务或事件放入队列的尾部,并按照它们被放入队列的顺序进行处理。

队列的常见操作包括入队(向队列尾部添加元素)、出队(从队列头部删除元素)、获取队列头部的元素(但不删除)、判断队列是否为空等。

队列可以用数组或链表实现。使用数组实现的队列称为顺序队列,使用链表实现的队列称为链式队列。顺序队列的插入和删除操作会涉及元素的移动,而链式队列不需要移动元素,因此插入和删除操作的时间复杂度都是O(1)。

(二)头文件

队列可以使用链表实现,也可以使用顺序表实现,但是队列需要频繁的头删,顺序表的头删效率低,由于队列规定了队头出,队尾进,所以顺序表的随机访问功能在队列中用不到;而链表的头删与尾插效率高,适合实现队列,因此本文用链表实现队列。


什么是SLT?

SLT库

STL(Standard Template Library)是C++的标准库,提供了一组通用数据结构和算法的模板,可以方便地用于各种应用程序的开发。

STL包含了多个模块,其中最重要的被称为容器(Containers)、算法(Algorithms)和迭代器(Iterators)。

容器模块包括了多种数据结构,如向量(vector)、链表(list)、队列(queue)、栈(stack)、集合(set)、映射(map)等。这些容器提供了不同的数据组织方式和操作,可以根据需要选择合适的容器进行数据存储和访问。

算法模块包含了多种常用算法,如排序、查找、合并、遍历等。这些算法可以用于各种数据结构上,无需重复实现,只需直接调用相应的算法函数即可。

迭代器模块提供了一种通用的访问容器元素的方式,通过迭代器可以遍历容器中的元素,并进行读取、修改等操作。迭代器相当于一个指针,可以指向容器中的某个位置,通过迭代器可以直接访问容器中的元素。

本文根据Cpp的STL库来实现队列(Queue)的相关功能:包括队列初始化,销毁,向队列中插入数据(入队),删除数据(出队),得到队列的头数据(front),得到队列的尾数据(tail),判断队列是否为空,得到队列内数据个数等共八项功能接口。

这里不加解释的给出头文件,根据头文件来实现队列的具体功能:

cpp 复制代码
#pragma once

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

/*		基于链表实现队列,入数据的为队尾,出数据的为队头
 *		顺序表实现队列头删效率低
 *		顺序表的随机访问队列中用不到
 *		所以选择用链表实现队列
*/
//队列存储数据类型
typedef int QueueDatatype;

//队列的一个节点
typedef struct QueueNode
{
	QueueDatatype data;
	struct QueueNode* next;
}QNode;

//一个队列
typedef struct Queue
{
	QNode* phead;//指向队列头的指针
	QNode* ptail;//指向队列尾的指针
	int size;    //队列内数据个数
}Queue;

//初始化队列
void Qinit(Queue* pq);

//销毁队列
void QDestroy(Queue* pq);

//向队列插入数据
void Qpush(Queue* pq,QueueDatatype x);

//删除队列的数据
void Qpop(Queue* pq);

//得到front数据
QueueDatatype Qfront(Queue* pq);

//得到tail数据
QueueDatatype Qback(Queue* pq);

//判断队列是否为空
bool Qempty(Queue* pq);

//得到队列内数据个数
int Qsize(Queue* pq);

(三) 功能实现

(1)初始化

队列初始化

首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

将队列的头尾指针都置空,表示此时队列内没有任何数据,数据个数(size)置0;

cpp 复制代码
//初始化队列
void Qinit(Queue* pq)
{
	assert(pq);

	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

(2) 销毁队列

销毁队列

首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

创建pcur指针,遍历链表;

创建next指针,保存下一个节点,防止释放此节点后,无法解引用找到下一个节点;

最后,分别指向队头与队尾的phead与ptail指针要置空;

cpp 复制代码
//销毁队列
void QDestroy(Queue* pq)
{
	assert(pq);

	QNode* pcur = pq->phead;
	while (pcur)
	{
		QNode* next = pcur->next;
		free(pcur);
		pcur = next;
	}
	pq->ptail = pq->phead = NULL;
}

(3) 入队

入队

首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

入队时,队列有两种状态:

若队列为空(此时队头队尾都为空),让头指针和尾指针都指向新节点newnode;

若队列不为空,执行尾插;

不要忘记让队列的size++;

cpp 复制代码
//向队列插入数据
void Qpush(Queue* pq, QueueDatatype x)
{
	assert(pq);

	//获取新节点
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail!");
		return;
	}
	newnode->data = x;
	newnode->next = NULL;

	//队列为空,此时队头队尾都为空
	if (pq->phead == NULL)
	{
		assert(pq->ptail == NULL);//防止一个为NULL一个不为NULL的情况

		pq->phead = pq->ptail = newnode;
	}
	else//队列不为空,尾插
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	//队列节点数加一
	pq->size++;
}

(4)出队

出队

首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

判断队列不为空,通过assert断言实现;

执行头删,创建next指针保存phead的next节点,freephead后,通过next找到新的头节点;

不要忘记队列的size--;

cpp 复制代码
//删除队头的数据
void Qpop(Queue* pq)
{
	assert(pq);
	assert(!Qempty(pq));
	
	QNode* next = pq->phead->next;
	free(pq->phead);
	pq->phead = next;
	pq->size--;
}

(5)得到队头的数据

首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

直接返回即可;

cpp 复制代码
//得到front数据
QueueDatatype Qfront(Queue* pq)
{
	assert(pq);

	return pq->phead->data;
}

(6)得到队尾的数据

首先函数接收的指针不能是空指针(若是空,无法进行解引用操作),可以通过assert断言实现;

直接返回即可;

cpp 复制代码
//得到tail数据
QueueDatatype Qback(Queue* pq)
{
	assert(pq);

	return pq->ptail->data;
}

(7)判断队列是否为空

返回判断表达式的结果;(若队列为空,返回真(1),否则返回假(0))

cpp 复制代码
/判断队列是否为空
bool Qempty(Queue* pq)
{
	//队列为空,返回真;非空,返回假
	return pq->size == 0;
}

(8)得到队列内数据个数

直接返回队列的size即可;

cpp 复制代码
//得到队列内数据个数
int Qsize(Queue* pq)
{
	return pq->size;
}

完 ~

未经作者同意禁止转载

相关推荐
IT技术分享社区19 分钟前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
极客代码22 分钟前
【Python TensorFlow】入门到精通
开发语言·人工智能·python·深度学习·tensorflow
疯一样的码农28 分钟前
Python 正则表达式(RegEx)
开发语言·python·正则表达式
passer__jw76729 分钟前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
&岁月不待人&1 小时前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
StayInLove1 小时前
G1垃圾回收器日志详解
java·开发语言
TeYiToKu1 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
无尽的大道1 小时前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
互联网打工人no11 小时前
每日一题——第一百二十四题
c语言
爱吃生蚝的于勒1 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法