[全网最细数据结构完整版]第七篇: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.xdnf.cn/news/9979.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

点阵数显驱动IC数显LED驱动芯片VK1651

产品品牌&#xff1a;永嘉微电/VINKA 产品型号&#xff1a;VK1651 封装形式&#xff1a;SOP16 产品年份&#xff1a;新年份 产品简介&#xff1a;VK1651是一种带键盘扫描电路接口的 LED 驱动控制专用芯片&#xff0c;内部集成有数据锁存器、LED 驱动、键盘扫描等电路。SEG脚…

【进阶】java基础之集合(2)数据结构<树>

文章目录 二叉树的内部结构二叉查找树平衡二叉树平衡二叉树的旋转机制 二叉树的内部结构 二叉查找树 二叉查找树&#xff0c;又称二叉排序树或者二叉搜索树 特点: 每一个节点上最多有两个子节点任意节点左子树上的值都小于当前节点任意节点右子树上的值都大于当前节点 二叉…

积分接口被刷爆,全体一个月降薪20%,这个项目我们遗漏了什么?

有一些往事总是会在酒后提起 我问朋友&#xff0c;在工作上有什么事情是到现在还记忆尤新的&#xff1f; 我朋友一个激灵坐起来&#xff0c;点上一支烟&#xff0c;只见烟头亮了4、5下&#xff0c;才见他吐出一口烟来&#xff0c;说道&#xff1a;“那还真有” 起因 刚参加…

AWTK-LINUX-FB实现多点触摸

两周前的一个地图&#xff0c;需要做手势缩放的功能&#xff0c;比较忙就没有发出来&#xff0c;这次抽时间记录一下实现的过程。 AWTK官方有对实现多点触摸做过描述&#xff0c;可惜只有STM32的实现例子&#xff0c;跟Linux的差别还是比较大的&#xff0c;好在tslib有多点触摸…

NRF52832学习笔记(41)——添加串口库libuarte

一、背景 由于板子上不支持硬件流控&#xff0c;在使用 app_uart_fifo 库接收串口大数据时&#xff0c;频繁报 APP_UART_COMMUNICATION_ERROR 错误&#xff0c;多次重新初始化后&#xff0c;串口也不再产生中断了。查看官方论坛后决定使用串口异步库 libuarte。 二、简介 Li…

ORU 的 Open RAN 管理平面 (M 平面)

[TOC](ORU 的 Open RAN 管理平面 (M 平面)) ORU 的 Open RAN 管理平面 (M 平面) https://www.techplayon.com/open-ran-management-plane-m-plane-for-open-radio-unit/ ORU M 平面 在 ORAN 中&#xff0c;设置参数的 O-RU 管理功能是通过 M-Plane 完成的。管理功能包括 O-…

MQ的基础知识

一.什么是MQ 其实就是不同的程序之间的一种的通信方式,通过将消息发送到中间件里面然后中间件就会将这个消息发送给相应的服务进行一个消息的消费,这个时候就会进行一些的业务逻辑的处理,这个方式提高了整个系统的可靠性,拓展性以及灵活性.常见的类型为Aapache Kafaka&#xf…

蓝牙OPP协议详解及Android实现

文章目录 前言一、什么是蓝牙OPP协议&#xff1f;二、OPP协议工作流程1. 设备配对和连接2. 启动 OPP 服务3. 发送对象4. 传输对象5. 传输完成6. 断开连接 三、 Android OPP协议实现1. 启动 OPP 服务器&#xff08;接收方&#xff09;2. 发送文件&#xff08;发送方&#xff09;…

医学可视化之涟漪图

在医学领域&#xff0c;数据可视化能够帮助我们更直观地理解和分析复杂的信息。涟漪图作为一种独特的可视化工具&#xff0c;具有重要的作用、价值和广泛的使用场景。 一、涟漪图的特点 涟漪图是一种基于地理位置的可视化图表&#xff0c;它通过在地图上显示不同大小或颜色的…

定义宏将整数的二进制的奇数位和偶数位互换位置

假设这个数为n00000000 00000000 00000000 00001101——13 1.思路 1.1 奇数位&#xff1a;00000000 00000000 00000000 00000101 但是怎么获得奇数位呢&#xff1f;——进行按位与运算 不懂如何运算的可以看我主页的详解操作符-CSDN博客&#xff0c;该章详细写了各个操作符如何…

快要结束的大学时光

目录 大一 大一上学期 Java HTMLCSS 大一下学期 HTMLCSSJS JAVA python 大二 大二上学期 Java 原型 前端 大二下学期 前端 数据结构 Android BootStrap JavaWeb ios程序设计 软件测试​编辑 大三 大三上学期 小程序 大三下学期 JavaWeb 整理数据库 大…

高效实现MySQL数据集成的具体案例分享

MySQL数据集成案例分享&#xff1a;1–BI秉心-店铺信息表–store_z–>store 在数据驱动的业务环境中&#xff0c;如何高效、可靠地实现数据集成是每个企业面临的重要挑战。本文将聚焦于一个具体的系统对接集成案例&#xff1a;将MySQL中的店铺信息表store_z的数据集成到另一…

[Docker#3] LXC | 详解安装docker | docker的架构与生态

目录 1.LXC容器操作 安装LXC LXC容器操作步骤 2.理论 LXC 是什么&#xff1f; Docker 是什么 Docker 和虚拟机的区别 Docker 和 JVM 虚拟化的区别 Docker 版本 ⭕Docker 官方网站&#xff08;建议收藏&#xff09; Docker 架构 生活案例 Docker 生态 Docker 解决…

CAP相关的分布式技术

目录 一&#xff0c;CAP理论基础 1.1、一致性&#xff08;Consistency&#xff09; 1.2、可用性&#xff08;Availability&#xff09; 1.3、分区容忍性&#xff08;Partition Tolerance&#xff09; 1.4、CAP理论的核心观点 二&#xff0c;如何选C与A 2.1、网络分区情况…

【春秋云镜】CVE-2023-2130

目录 CVE-2023-2130漏洞利用漏洞检测防御措施 靶标介绍&#xff1a;解法一&#xff1a;解法二&#xff1a; CVE-2023-2130 漏洞详细信息 漏洞编号&#xff1a;CVE-2023-2130漏洞名称&#xff1a;SQL注入漏洞受影响的版本&#xff1a;SourceCodester采购订单管理系统1.0影响范…

Code::Blocks 24.10 全中文优化完整版

Code::Blocks&#xff08;或者叫做 CodeBlocks&#xff09;是一款开放源代码、跨平台的集成开发环境&#xff08;IDE&#xff09;&#xff0c;通过配置不同的编程语言编译器&#xff0c;可以用于多种编程语言程序开发。 网上有很多文章介绍 Code::Blocks 的安装&#xff0c;通…

二叉树-哈夫曼树的构造和应用

重点:哈夫曼树的构造和应用(编码) 选取完最小权值的两个节点后新结点的权值是二者之和,新节点可以和选取剩余的结点结合,也可以在剩余的里面选出最小两个结合后形成的新结点与第一个新结点结合(前提他们是最小的两个结点) 哈夫曼编码 哈夫曼编码优化 130为最小的带权路径长度 …

d3坐标轴系数角度变换-位置不对等问题

svg.append(text).attr(x, 100) // 文本 x 坐标.attr(y,200 ) // 文本 y 坐标// .attr(text-anchor, middle) // 文本居中.attr(fill, black) // 文本颜色.attr(transform, rotate(-90, 25, 30)) // 旋转 -90 度.attr(font-size, 9).text(你的文本); 有些老哥…

rosbag数据导出成pcd文件

目录 步骤 1&#xff1a;安装必要的 ROS 包步骤 2&#xff1a;播放 .bag 文件中的点云数据&#xff08;非必须&#xff09;步骤 3&#xff1a;使用 pcl_ros 提取并保存点云数据步骤 4&#xff1a;验证输出 要将 .bag 文件中的点云数据导出为 .pcd 文件&#xff0c;通常需要以…

基于 Spring Boot 和 Vue 的门票销售创新系统

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…