数据结构初阶 队列

ops/2024/10/19 7:39:40/

一. 队列的基本介绍

1. 基本概念

队列是基本数据结构的一种 它符合先进先出的原则

 我们来看图

 

大概就是这样子的一种情况 

我们想想看 应该用数组还是链表来实现这个结构方便一点呢

我想同学们心里现在肯定已经有了答案了

肯定不是数组

为什么呢?

因为我们如果用数组头作为队头的话 每次删数据就要往前移动很多组其他的数据

这里有同学肯定会有这样子的疑问?

不移动可不可行呢?

当然不可以 !

队列这种数据结构已经规定死了就是头出 尾进

所以说我们使用链表来实现这个数据结构

2. 代码表示

typedef int QDateType;
typedef struct QueueNode
{struct QueueNode* next;QDateType date;
}QNode;
typedef struct Queue
{QNode* head;QNode* tail;int size;
}Queue;

仔细看

我们这里使用QueueNode来表示储存数据的一个个节点

使用Queue来表示两个指针 头和尾

可以看图理解快一点

二. 接口函数的实现 

1. 队列初始化

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

队列初始化实际上就是将队列的两个指针置空

我们来看看效果

这里没有传二级指针进去到底能不能将一级指针置空

成功将两个指针置空了

这是为什么呢?

因为我们的头和尾指针实际上是储存在一个结构体里面的

当我们将结构体的地址传进去的时候 结构体指针能够访问到结构体内部的内容(这两个指针)并且可以修改它们

2. 插入数据

这里插入数据我们要考虑两种情况

1.如果head和tail指针指向NULL,就需要将newnode赋给head和tail指针

2.head和tail不指向NULL,就将newnode的地址赋给tail->next,再将tail移到newnode即可

代码如下:

//队进
void QueuePush(Queue* pq, QDateType x)
{assert(pq);//开辟新节点QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}//赋值newnode->next = NULL;newnode->date = x;//判断是否为空if (pq->head == NULL){pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}//个数要++pq->size++;
}

 看看效果怎么样

可以运行

3. 删除数据

这里我们要注意的是

由于队列结构的特殊性

我们在打印数据的时候必须要删除数据

所以我们先写删除数据的接口函数

代码表示如下

void QueuePop(Queue* pq)
{assert(pq);assert(pq->head!=NULL);//只有一个节点if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else{//保存下一位QNode* next = pq->head->next;free(pq->head);pq->head = next;//迭代}//个数要--pq->size--;
}

看看效果:

可以运行

4. 摧毁队列

直接看代码:

void QueueDestroy(Queue* pq)
{assert(pq);//两个结构体依次销毁 先销毁QNodeQNode* cur = pq->head;while (cur){QNode* next = cur->next;free(cur);cur = next;}//再置空Queuepq->head = pq->tail = NULL;pq->size = 0;
}

注意:两个结构体要依次销毁,类似(套娃) 

我们来看看效果

5. 判断为空

这个也很简单和栈差不多

这里就直接给代码了

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

6.返回大小

这个也很简单,因为我们在Queue结构体中已经定义过size了,我们直接返回就可以

直接看代码:

//大小
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}

7. 返回头数据

这个很简单 返回head的值就可以了

注意断言的使用

//对头
QDateType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->date;
}

8.返回尾数据

一样的简单

也要注意断言的使用

//队尾
QDateType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->date;
}

以上便是本文所有内容了,如有错误请各位大佬不吝赐教,感谢留言


http://www.ppmy.cn/ops/45342.html

相关文章

全同态加密生态项目盘点:FHE技术的崛起以及应用

撰文:Chris,Techub News 在当今数字化的时代,隐私保护已成为一个全球性的焦点话题,特别是在加密货币和区块链技术快速发展的背景下。虽然当前的隐私技术在保护数据安全方面多有欠缺,引发了广泛的关注和批评&#xff0c…

JVM学习-垃圾回收(一)

什么是垃圾 垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾如果不及时对内存的垃圾进行清理,垃圾对象所占用的内存空间会一直保留到应用程序结束,被保留的空间无法被其它对象所用,甚至可能导致内存溢…

【MySQL数据库】 MySQL主从复制

MySQL主从复制 MySQL主从复制主从复制与读写分离的意义主从数据库实现同步(主从复制)三台mysql服务器搭建主从复制,要求不可以用root帐号同步,要求第三台服务器在测试过1、2的主从复制之后进行主从复制配置四台mysql服务器(m1,s1,…

力扣:104. 二叉树的最大深度

104. 二叉树的最大深度 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入&#xff1a…

同比和环比

1、概述 同比和环比是两种常见的数据分析方法,用于衡量数据在不同时间段的变化情况。通过同比和环比的计算,可以更清晰地了解数据在不同时间段的增长或下降情况,从而为决策提供依据。 2、同比 同比(Year-on-Year, YoY&#xff09…

【Docker】2、配置SSL证书远程访问Docker

1、使用 openssl 生成 ca 1、创建文件夹 mkdir -p /root/dockercd /root/docker2、创建 RSA 私钥 会提示 2 次输入证书密码,至少 4 位,创建后会生成一个 ca-key.pem 文件 openssl genrsa -aes256 -out ca-key.pem 4096得到 ca-key.pem 文件 3、创建…

Javascript 位运算符(,|,^,<<,>>,>>>)

文章目录 一、什么是位运算?二、如何使用1. 位与(AND):&用途(1)数据清零(2)判断奇偶 2. 位或(OR):|用途(1)向下取整 3…

J.搬砖【蓝桥杯】/01背包+贪心

搬砖 01背包贪心 思路&#xff1a;要让重量更小的在更前面&#xff0c;价值更大的在更后面&#xff0c;vi−wj>vj−wi viwi>vjwj 第 i 个箱子放在第 j 个箱子下面就显然更优。所以进行排序再用01背包即可。 #include<iostream> #include<algorithm> #defi…