【数据结构】栈和队列(队列的基本操作和基础知识)

🌈个人主页: 秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343
🔥 系列专栏: 《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm=1001.2014.3001.5482

目录

前言

队列

队列的概念和结构

队列的实现

单链表队列的实现

总的声明

初始化

销毁

插入

删除

取队头

取队尾

判断是否为空

返回队列数据个数

队列的一对一关系


前言

💬 hello! 各位铁子们大家好哇。

这是2024年的第一篇博客。

🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

队列

队列的概念和结构

队列的实现

队列也有数组队列 和**链式队列。**队列的特点是先进先出。实现时,数组队列,不适合头删。双向链表需要多个指针,因此,这里选择使用单链表实现。

单链表队列的实现

总的声明

cpp 复制代码
typedef int QDataType;
typedef struct QueueNode
{	
	QDataType val;
	struct QueueNode* next;
}QNode;

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;


void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);
void QueuePush(Queue* pq, QDataType x);
void QueuePop(Queue* pq);
QDataType QueueFront(Queue* pq);
QDataType QueueBack(Queue* pq);
bool QueueEmpty(Queue* pq);
int	QueueSize(Queue* pq);

初始化

上方的Push函数是有问题的,因为队列的特点是队尾进,队头出。所以插入时是尾插,单链表不好找队尾,就需要一个指向队尾的指针。因为我们的单链表是不带头节点的, 所以传一级指针也是有问题的。

解决方法:

我们将两个一级指针都放在结构体中,传参时传这个结构体指针,这样只需要传一级指针。因为改变phead和ptail时,我们改的是结构体的内容,传结构体指针即可。

下方是初始化代码:

cpp 复制代码
typedef int QDataType;
typedef struct QueueNode
{	
	QDataType val;
	struct QueueNode* next;
}QNode;

typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;

销毁

cpp 复制代码
void QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

插入

cpp 复制代码
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	newnode->val = x;
	newnode->next = NULL;

	if (pq->ptail == NULL)
	{
		pq->ptail = pq->phead = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	pq->size++;
}

删除

cpp 复制代码
void QueuePop(Queue* pq) 
{
	assert(pq);
	assert(pq->phead);

	QNode* del = pq->phead;
	pq->phead = pq->phead->next;
	free(del);
	del = NULL;
	if (pq->phead == NULL)
	{
		pq->ptail = NULL;	
	}
	pq->size--;
}

取队头

cpp 复制代码
QDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(pq->phead);
	return pq->phead->val;
}

取队尾

cpp 复制代码
QDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(pq->ptail);
	return pq->ptail->val;
}

判断是否为空

cpp 复制代码
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->phead == NULL;
}

返回队列数据个数

cpp 复制代码
int	QueueSize(Queue* pq)
{
	assert(pq);
	return pq->size;
}

队列的一对一关系

队列的特点是先进先出,与栈不同。入队的顺序只有一种,出队的顺序也只有一种。

相关推荐
一颗知足的心7 分钟前
Go语言之路————指针、结构体、方法
开发语言·后端·golang
yuanpan18 分钟前
C#如何正确的停止一个多线程Task?CancellationTokenSource 的用法。
开发语言·c#
程高兴20 分钟前
单相交直交变频电路设计——matlab仿真+4500字word报告
开发语言·matlab
8RTHT34 分钟前
数据结构(七)---链式栈
数据结构
我真的不会C1 小时前
QT中的事件及其属性
开发语言·qt
mit6.8241 小时前
[Lc_week] 447 | 155 | Q1 | hash | pair {}调用
算法·leetcode·哈希算法·散列表
Fency咖啡2 小时前
《代码整洁之道》第9章 单元测试 - 笔记
数据结构·b树
2501_906314322 小时前
优化无头浏览器流量:使用Puppeteer进行高效数据抓取的成本降低策略
开发语言·数据结构·数据仓库
C182981825752 小时前
项目中数据结构为什么用数组,不用List
数据结构
jerry6092 小时前
优先队列、堆笔记(算法第四版)
java·笔记·算法