[全网最细数据结构完整版]第七篇:3分钟带你吃透队列

目录

1->队列的概念及结构

2->队列的实现

 2.1定义队列基本结构 struct QueueNode 和  struct Queue

 2.2队列初始化函数 QueueInit 函数

 2.3队列销毁函数 QueueDestroy 函数

 2.4队列插入数据函数 QueuePush 函数

 2.5判断队列是否为空,空返回true,非空返回false

 2.6队列删除数据 QueuePop 函数

 2.7获取队列头部数据 QueueFront 函数

 2.8获取队列尾部数据 QueueBack 函数

 2.9获取队列有效元素的个数 QueueSize 函数

3->测试我们自己写的栈

4->扩展知识,在Linux专栏讲解 

5->做几道选择题

6->您的专属鼓励师


1->队列的概念及结构

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

  • 入队列:进行插入操作的一端称为队尾
  • 出队列:进行删除操作的一端称为队头

2->队列的实现

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

 2.1定义队列基本结构 struct QueueNode 和  struct Queue

#pragma once//Queue.h
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>//链式结构:表示队列
typedef struct QueueNode
{struct QueueNode* _next;//指向下一个结点int _data;//数据域
}QNode;//队列的结构
typedef struct Queue
{QNode* _phead;//指向队列头部的结点QNode* _ptail;//指向队列尾部的结点int _size;//队列中结点的个数
}Queue;//1.队列初始化
void QueueInit(Queue* pq);
//2.队列销毁
void QueueDestroy(Queue* pq);
//3.队列插入数据
void QueuePush(Queue* pq, int x);
//4.队列删除数据
void QueuePop(Queue* pq);
//5.获取队列头部数据
int  QueueFront(Queue* pq);
//6.获取队列尾部数据
int  QueueBack(Queue* pq);
//7.获取队列有效元素的个数
int  QueueSize(Queue* pq);
//8.判断队列是否为空,空返回true,非空返回false
bool QueueEmpty(Queue* pq);

 2.2队列初始化函数 QueueInit 函数

//1.队列初始化
void QueueInit(Queue* pq)
{assert(pq);pq->_phead = NULL;pq->_ptail = NULL;pq->_size = 0;
}

 2.3队列销毁函数 QueueDestroy 函数

//2.队列销毁
void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->_phead;while (cur != NULL){QNode* next = cur->_next;free(cur);cur = next;}pq->_phead = pq->_ptail = NULL;pq->_size = 0;
}

2.4队列插入数据函数 QueuePush 函数

//3.队列插入数据
void QueuePush(Queue* pq, int x)
{assert(pq);//申请结点QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc failed");return;}newnode->_data = x;newnode->_next = NULL;//插入数据//两种情况//1.没有结点//2.有结点if(pq->_phead == NULL && pq->_ptail == NULL){pq->_phead = pq->_ptail = newnode;}else{pq->_ptail->_next = newnode;pq->_ptail = newnode;}pq->_size++;
}

 2.5判断队列是否为空,空返回true,非空返回false

//4.判断队列是否为空,空返回true,非空返回false
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->_size == 0;
}
//5.队列删除数据
void QueuePop(Queue* pq)
{assert(pq);//得有数据才能删除对吧assert(!QueueEmpty(pq));//分为两种情况//1.只有一个结点//2.多个结点if (pq->_phead->_next == NULL){free(pq->_phead);pq->_phead = pq->_ptail = NULL;}else{QNode* next = pq->_phead->_next;free(pq->_phead);pq->_phead = next;}pq->_size--;
}

2.6队列删除数据 QueuePop 函数

//5.队列删除数据
void QueuePop(Queue* pq)
{assert(pq);//得有数据才能删除对吧assert(!QueueEmpty(pq));//分为两种情况//1.只有一个结点//2.多个结点if (pq->_phead->_next == NULL){free(pq->_phead);pq->_phead = pq->_ptail = NULL;}else{QNode* next = pq->_phead->_next;free(pq->_phead);pq->_phead = next;}pq->_size--;
}

 

2.7获取队列头部数据 QueueFront 函数

//6.获取队列头部数据
int  QueueFront(Queue* pq)
{assert(pq);assert(pq->_phead);return pq->_phead->_data;
}

2.8获取队列尾部数据 QueueBack 函数

//7.获取队列尾部数据
int  QueueBack(Queue* pq)
{assert(pq);assert(pq->_ptail);return pq->_ptail->_data;
}

 2.9获取队列有效元素的个数 QueueSize 函数

//8.获取队列有效元素的个数
int  QueueSize(Queue* pq)
{assert(pq);return pq->_size;	
}

3->测试我们自己写的栈

测试代码如下:

#include "Queue.h"void testQueue()
{Queue q;QueueInit(&q);QueuePush(&q, 1);QueuePush(&q, 2);QueuePush(&q, 3);QueuePush(&q, 4);QueuePush(&q, 5);QueuePush(&q, 6);while (!QueueEmpty(&q)){int num = QueueFront(&q);printf("%d->",num);QueuePop(&q);}QueueDestroy(&q);}int main()
{testQueue();return 0;
}

 看下控制台输出:欧耶!我们自己写的栈可以正常运行

4->扩展知识,在Linux专栏讲解 

另外扩展了解一下,实际中我们有时还会使用一种队列叫循环队列。如操作系统专栏讲解生产者消费者模型时可以就会使用循环队列。环形队列可以使用数组实现,也可以使用循环链表实现。
 

 

 5->做几道选择题

1.一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,则元素出栈的顺序是( )。

A 12345ABCDE B EDCBA54321 C ABCDE12345 D 54321EDCBA

2.若进栈序列为 1,2,3,4 ,进栈过程中可以出栈,则下列不可能的一个出栈序列是()

A 1,4,3,2 B 2,3,4,1 C 3,1,4,2 D 3,4,2,1

3.循环队列的存储空间为 Q(1:100) ,初始状态为 front=rear=100 。经过一系列正常的入队与退队操作

后, front=rear=99 ,则循环队列中的元素个数为( )

A 1 B 2 C 99

D 0或者100

4.以下( )不是队列的基本运算?

A 从队尾插入一个新元素B 从队列中删除第i个元素C 判断一个队列是否为空

D 读取队头元素的值
5.现有一循环队列,其队头指针为front,队尾指针为rear;循环队列长度为N。其队内有效长度为?(假设

队头不存放数据)

A (rear - front + N) % N + 1

B (rear - front + N) % N

C ear - front) % (N + 1)

D (rear - front + N) % (N - 1)

答案:

1.B

2.C

3.D

4.B

5.B

 6->您的专属鼓励师

        有些事情,你永远都没有办法做到“顶尖”,因为智力跟不上.但是所有的事情,你都可以做到“高段”,因为它需要的是时间的累积和精力的打磨.不聪明与聪明之间的区别,是很微妙的.有时候我们只会通过一次两次的结果,来判断整个人、整件事,其实这是不明智的.从小,邻居和亲戚在谈论我的时候,都会觉得我很聪明。但是只有我自己知道,我从来没有聪明过,只是看上去比较聪明而已.

        修行之路确实枯燥,但是我们把问题搞懂以后就发现他是那样的美妙!一遍学不会没关系吖,多看几遍,我也是学了好多遍呢,小伙伴们肯定学的又快又好!!!最后希望写的内容对小伙伴们有所帮助,我写的如果有哪里不对的地方请在评论区或者私信指出来哦!让我们一起进步吖,任何疑问包括心情不好都可以找我聊聊,我很乐意当你的倾听者吖.   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/59833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣动态规划基础版(矩阵型)

62.不同路径&#xff08;唯一路径问题&#xff09; 62. 不同路径https://leetcode.cn/problems/unique-paths/ 方法一&#xff1a;动态规划 找状态转移方程&#xff0c;也就是说它从左上角走到右下角&#xff0c;只能往右或者往下走&#xff0c;那么设置一个位置为&#xff…

算法(第一周)

一周周五&#xff0c;总结一下本周的算法学习&#xff0c;从本周开始重新学习许久未见的算法&#xff0c;当然不同于大一时使用的 C 语言以及做过的简单题&#xff0c;现在是每天一题 C 和 JavaScript&#xff08;还在学&#xff0c;目前只写了一题&#xff09; 题单是代码随想…

08 反射与注解

目录 1.Java类加载机制 类加载器 双亲委派模型 工作流程 优点 2.反射 基本概念 常见用法 1. 获取 Class 对象 2.获取构造方法 3.获取成员方法 4.获取成员变量 3.注解 注解的基本概念 定义和使用注解 定义注解 使用注解 解释 元注解详解 常见内置注解 总结…

【Linux第八课-进程间通信】管道、共享内存、消息队列、信号量、信号、可重入函数、volatile

目录 进程间通信为什么&#xff1f;是什么&#xff1f;怎么办&#xff1f;一般规律具体做法 匿名管道原理代码 命名管道原理代码 system V共享内存消息队列信号量信号量的接口 信号概念为什么&#xff1f;怎么办&#xff1f;准备信号的产生信号的保存概念三张表匹配的操作和系统…

【一些正经的思考】牵牛花在秋天播种可以开花吗

这是一篇正经的思考&#xff0c;因为是发生在工位上的事情&#xff0c;所以这也是上班记录~ 我入职新公司已经两个月了&#xff0c;和部门的新伙伴出去吃饭的频率高了1000%&#xff0c;不得不说&#xff0c;这边的食堂确实不是那么好吃&#xff0c;就和小伙伴经常去一个在江边…

零基础Java第十四期:继承与多态(二)

目录 一、继承 1.1. 继承的方式 1.2. final关键字 1.3. 继承与组合 1.4. protected关键字 二、多态 2.1. 多态的概念 2.2. 向上转型 2.3. 重写 2.4. 向下转型 2.5. 多态的优缺点 一、继承 1.1. 继承的方式 猫类可以继承动物类&#xff0c;中华田园猫类可以继承猫类…

RocketMQ 广播消息

所谓的广播消息就是发送的一条消息会被多个消费者收到。 ⼴播是向主题&#xff08; topic &#xff09;的所有订阅者发送消息。订阅同⼀个 topic 的多个消费者&#xff0c;能全量收到⽣产者发送的所有消息。 生产者发送了10个order&#xff0c;每个order里面有5个消息&#xff…

.Net IOC理解及代码实现

IOC理解 IoC(Inversion of Control)&#xff1a;即控制反转&#xff0c;这是一种设计思想&#xff0c;指将对象的控制权交给IOC容器&#xff0c;由容器来实现对象的创建、管理&#xff0c;程序员只需要从容器获取想要的对象就可以了。DI(Dependency Injection)&#xff0c;即依…

react的创建与书写

一&#xff1a;创建项目 超全面详细一条龙教程&#xff01;从零搭建React项目全家桶&#xff08;上篇&#xff09; - 知乎 1.创建一个文件夹&#xff0c;shift鼠标右键选择在此处打开powershell 2.为了加速npm下载速度&#xff0c;先把npm设置为淘宝镜像地址。 npm config s…

【微信小游戏学习心得】

这里是引用 微信小游戏学习心得 简介了解微信小游戏理解2d游戏原理数据驱动视图总结 简介 本人通过学习了解微信小游戏&#xff0c;学习微信小游戏&#xff0c;加深了对前端框架&#xff0c;vue和react基于数据驱动视图的理解&#xff0c;及浏览器文档模型和javaScript之间的关…

深究JS底层原理

一、JS中八种数据类型判断方法 在JavaScript中&#xff0c;数据类型分为两大类&#xff1a;基本&#xff08;原始&#xff09;数据类型和引用&#xff08;对象&#xff09;数据类型。 基本数据类型&#xff08;Primitive Data Types&#xff09; 基本数据类型是表示简单的数…

ssm071北京集联软件科技有限公司信息管理系统+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;北京集联软件科技有限公司信息管理系统 \ 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本信息…

Yocto 项目下通过网络更新内核、设备树及模块

Yocto 项目下通过网络更新内核、设备树及模块 前言 在 Yocto 项目的开发过程中&#xff0c;特别是在进行 BSP&#xff08;Board Support Package&#xff09;开发时&#xff0c;经常需要调整特定软件包的版本&#xff0c;修改内核、设备树以及内核模块。然而&#xff0c;每次…

k8s集群安装(kubeadm)

k8s集群安装&#xff08;kubeadm&#xff09; 1、环境准备&#xff08;master和node节点都执行&#xff09;1.1、替换yum源1.2、关闭selinux1.3、永久关闭防火墙1.4、永久关闭swap1.5、修改主机名添加host1.6、时间同步1.7、将桥接的IPv4流量传递到iptables的链1.8、docker安装…

【日常问题排查小技巧-连载】

线上服务CPU飙高排查 先执行 top&#xff0c;找到CPU占用比较高的进程 id&#xff0c;&#xff08;比如 21448&#xff09; jstack 进程 id > show.txt&#xff08;jstack 21448 > show.txt&#xff09; 找到进程中CPU占用比较高的线程&#xff0c;线程 id 转换为 16 进…

您与此网站之间建立的连接不安全解决方法

如果你打开网站&#xff0c;地址栏有警告&#xff0c;点进去是这样的提示&#xff1a;您与此网站之间建立的连接不安全&#xff0c;了解详细信息。 请勿在此网站上输入任何敏感信息&#xff08;例如密码或信用卡信息&#xff09;&#xff0c;因为攻击者可能会盗取这些信息。 …

【与AI+】学习SAP开发有什么渠道可以推荐

前言&#xff1a;好的&#xff0c;我又将开辟一个新的专栏&#xff0c;这个专栏呢&#xff0c;就准备放一些我向AI提问的问题&#xff0c;以及AI的回答。因为感觉真的好方便哈哈哈~ 我不是很确定我的专栏文章内容是否涉及版权&#xff0c;以及也不确定这些整合过的文字是否涉嫌…

江苏博才众创科技产业园集团拟投资10亿元在泰兴打造汽车零部件产业园

2024年11月7日&#xff0c;泰兴市高新技术产业开发区与江苏博才众创科技产业园集团举行新能源汽车零部件智能制造产业园项目签约仪式。 泰兴市高新区党工委委员、管理办副主任王峰表示&#xff1a;高新区是全市项目建设的主阵地&#xff0c;近年来聚焦高端化、智能化、绿色化&a…

【python】Flask

文章目录 1、Flask 介绍2、Flask 实现网页版美颜效果3、参考 1、Flask 介绍 Flask 是一个用 Python 编写的轻量级 Web 应用框架。它设计简单且易于扩展&#xff0c;非常适合小型项目到大型应用的开发。 以下是一些 Flask 库中常用的函数和组件&#xff1a; 一、Flask 应用对…

产品经理如何使用项目管理软件推进复杂项目按时上线

前言 相信很多产品同学或多或少都有过这样的经历&#xff1a;平时没有听到任何项目延期风险&#xff0c;但到了计划时间却迟迟无法提测……评审时没有任何argue&#xff0c;提测后发现开发的功能不是自己想要的……费劲九牛二虎之力终于让项目上线了&#xff0c;然而发现成果达…