【数据结构和算法初阶(C语言)】队列实操(概念实现+oj题目栈和队列的双向实现,超级经典!!!)

1. 队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,

队列具有先进先出 FIFO(First In First Out)

入队列:进行插入操作的一端称为队尾

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

2.队列结构存在的意义

①公平排队

比如医院或者银行的排号

②BFSL广度优先

3.队列实现的结构选择

数组和链表都可以实现队列,但是链表的头插尾插,头删尾删要方便些,所以首选链表

 单向还是双向:选择单向,双向的优势是方便找前一个1节点,没有这个需求。(找尾不是因为双向,双向循环方便找尾)

是否需要带哨兵位的链表:哨兵位是为了解决二级指针(可以将头尾指针封装为结构体进行传参,这样就可以改变真实的指针了,所以哨兵位可要可不要),尾插少一次判断。

选择单向不循环链表即可实现。

4.队列实现

typedef  int QdataType;typedef struct QListNode
{struct QListNode* next;QdataType data;
}QNode;//将头尾指针封装为一个结构体,解决传递二级指针的问题typedef struct Queue
{QNode* head;QNode* tail;int size;//保存链表的大小
}Queue;

5.队列对数据的处理

5.1队列初始化

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

5.2队尾入数据

void QueuePush(Queue* pq, QdataType x)//队列增加数据
{assert(pq);//首先传入的这个结构体要存在//申请到节点来创建QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc");}//新节点初始化newnode->data = x;newnode->next = NULL;//准备插入,看一下是不是第一次插入if (pq->tail == NULL){pq->head = pq->tail = newnode;pq->size++;}else{pq->tail->next = newnode;pq->tail = pq->tail->next;pq->size++;}
}

5.3队头出数据

void QueuepPop(Queue* pq, QdataType x)//队列删除元素
{assert(pq);assert(pq->size != 0);if (pq->head->next == NULL)//因为不是带哨兵位的,删除到最后一个位置防止尾指针成为野指针,单独处理{free(pq->head);pq->head = pq->tail = NULL;pq->size--;}else{QNode* next = pq->head->next;free(pq->head);pq->head = next;pq->size--;}}

5.4获取队列尾部元素

QdataType QueueBack(Queue* pq)//获取队列前后面元素
{assert(pq);assert(!QueueEmpty);return pq->tail->data;
}

5.5获取队列头部元素

QdataType QueueFront(Queue* pq)//获取队列前面元素
{assert(pq);assert(!QueueEmpty);return pq->head->data;
}

5.6获取队列中元素个数

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

5.7检测队列是否为空

bool QueueEmpty(Queue* pq)//检测队列是否为空
{assert(pq);return pq->head == NULL;
}

5.8销毁队列

void QueueDestory(Queue* pq)//销毁队列
{assert(pq);QNode* cur = pq->head;while (cur){QNode* next = cur->next;free(cur);cur = cur->next;}pq->head = pq->tail = NULL;pq->size = 0;
}

6.循环队列补充

 

7.使用队列实现栈

链接跳转题目:

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/implement-stack-using-queues/

分析:栈的结构特点是数据先进后出

           队列的结构特点是先进先出

 

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

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

相关文章

如何布局马斯克推特上喊的meme币赛道

2024年的牛市正如火如荼的开展,截止当下,比特币已经站上了7.3万美元,远超2021年高点的6.9万美元,比特币的未来是一片大海。 除了比特币的一枝独秀之外,meme板块可以说是市场资金最青睐的。尤其是马斯克在X分享PEPE相关…

【b站咸虾米】2 Vue基础(下) 2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例

课程地址:【2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例】 https://www.bilibili.com/video/BV1pz4y1S7bC/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 2 Vue基础 下 2.8 计算属性 2.8.1 计算属性使用 2.8.2 计算…

【Flutter学习笔记】9.6 动画切换组件(AnimatedSwitcher)

参考资料:《Flutter实战第二版》9.6 动画切换组件(AnimatedSwitcher) 9.6.1 AnimatedSwitcher AnimatedSwitcher 可以同时对其新、旧子元素添加显示、隐藏动画,在需要切换新旧元素的场景广泛使用。也就是说在AnimatedSwitcher的子…

2.MongoDB与关系数据库对比

MongoDB的简单操作与比较 与关系数据库对比 MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库。它们各有各的优点,来看看他们之…

数字排列 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C 题目描述 小明负责公司年会,想出一个趣味游戏: 屏幕给出 1−9 中任意 4 个不重复的数字,大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第 n 位置…

Turbo C++ v3.7.8.9的下载和安装(C语言编辑器完整安装步骤详细图文教程)·跟老吕学C语言(C语言必学教程之一)

[TOC](Turbo C v3.7.8.9的下载和安装(C语言编辑器完整安装步骤详细图文教程)) 跟老吕学C语言(C语言必学教程之一) 老吕是通过 Turbo C 编译器开始了 C 编程培训和开发。 本文中,老吕将带你了解如何下载 Turbo C,如何在任何最新 W…

二.递归及实例(汉诺塔问题)

目录 5.递归 6-递归实例:汉诺塔问题 思路: 详细过程: 代码: 5.递归 调用自身 结束条件 6-递归实例:汉诺塔问题 思路: 结果: 详细过程: 代码: #n为盘子的个数 a,b,c分别为3个地方. def hannuta(n,a,b,c): ​if n>0:hannuta(n-1,a,c,b) #将n-1个从a经过c移到到b(a…

23.1 微服务理论基础

23.1 微服务基础 1. 微服务介绍2. 微服务特点3. 微服务优缺点4. 微服务两大门派5. 微服务拆分6. 微服务扩展6.1 服务扩展6.2 按需扩展7. 微服务重要模块******************************************************************************************************************

Qt之格栅布局(QGridLayout)控件填满整个单元格

Qt专栏:http://t.csdnimg.cn/GQN1M 目录 1.现象1 2.解决方案 3.现象2 4.解决方案 5.总结 1.现象1 今天在用QGridLayout布局的时候,添加到布局的QWidget有文本框、标签、组合框和按钮等等,布局两列,通过下面的方式添加进去的&…

气压计LPS25HB开发(1)----轮询获取气压计数据

气压计LPS25HB开发----1.轮询获取气压计数据 概述视频教学样品申请源码下载产品特性通信模式速率生成STM32CUBEMX串口配置IIC配置SA0地址设置串口重定向参考程序SA0设置模块地址获取ID复位操作BDU设置设置速率轮询读取数据演示 概述 本文将介绍如何使用 LPS25HB 传感器来读取数…

Ansible自动化运维Inventory与Ad-Hoc

前言 自动化运维是指利用自动化工具和技术来简化、自动化和优化IT基础设施的管理和运维过程,从而提高效率、降低成本,并减少人为错误。在当今复杂的IT环境中,自动化运维已经成为许多组织和企业提高生产力和保证系统稳定性的重要手段。Ansibl…

[数据集][目标检测]零售柜零食检测数据集VOC+YOLO格式5422张113类

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):5422 标注数量(xml文件个数):5422 标注数量(txt文件个数):5422 标注…

Docker简介与安装

简介 用来快速构建、运行、管理应用的工具简单说,帮助我们部署项目以及项目所依赖的各种组件典型的运维工具 安装 1.卸载旧版 首先如果系统中已经存在旧的Docker,则先卸载: yum remove docker \docker-client \docker-client-latest \dock…

数字逻辑-时序逻辑电路二——沐雨先生

一、实验目的 (1)熟悉计数器的逻辑功能及特性。 (2)掌握计数器的应用。 (3)掌握时序逻辑电路的分析和设计方法。 二、实验仪器及材料 三、实验原理 1、集成4位计数器74LS161(74LS160&#…

自动控制原理--matlab/simulink建模与仿真

第一讲 自动控制引论 第二讲 线性系统的数学模型 第三讲 控制系统的复域数学模型(传递函数) 第四讲 控制系统的方框图 /video/BV1L7411a7uL/?p35&spm_id_frompageDriver pandas, csv数据处理 numpy,多维数组的处理 Tensor,PyTorch张量 工作原理图…

数据仓库为什么要分层建设?每一层的作用是什么?

在数字化时代,数据已成为企业最宝贵的资产之一。为了更好地管理和利用这些数据,许多企业都建立了数据仓库。然而,数据仓库并非简单的数据存储工具,而是一个复杂的数据处理和分析系统。其中,分层建设是数据仓库设计的重…

稀碎从零算法笔记Day17-LeetCode:有效的括号

题型:栈 链接:20. 有效的括号 - 力扣(LeetCode) 来源:LeetCode 题目描述(红字为笔者添加) 给定一个只包括 (,),{,},[,] 的字符串 …

SQLiteC/C++接口详细介绍之sqlite3类(六)

快速前往文章列表:SQLite—系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(五) 下一篇:SQLiteC/C接口详细介绍之sqlite3类(七) 19. sqlite3_changes与sqlite3_changes64 是SQLite中用…

【MyBatis-Plus】逻辑删除、乐观锁、防全表更新和删除实现 MyBatisX插件 高级扩展

文章目录 一、逻辑删除实现二、乐观锁实现2.1 悲观锁和乐观锁场景和介绍2.2 具体技术和方案:2.3 版本号乐观锁技术的实现流程2.4 使用mybatis-plus数据使用乐观锁 三、防全表更新和删除实现三、代码生成器(MyBatisX插件) 一、逻辑删除实现 物理删除:真实删除&#…

Flink on Yarn安装配置

前言 Apache Flink,作为一个开源的分布式处理引擎,近年来在大数据处理领域崭露头角,其独特的流处理和批处理一体化模型,使得它能够在处理无界和有界数据流时展现出卓越的性能。本文旨在对Flink进行简要的前言性介绍,以…