【数据结构和算法初阶(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.hqwc.cn/news/539629.html

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

相关文章

BUGKU-WEB shell

题目描述 题目截图如下: 描述: $poc "a#s#s#e#r#t";$poc_1 explode("#", $poc);$poc_2 $poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5];$poc_2($_GET[s])进入场景看看:是一个空白的界面 解题思路 …

从根到叶:深度理解哈希表

​​​​​​​ 一.哈希表的概念 关于查找元素时: 在顺序结构以及平衡树 中,元素关键码与其存储位置之间没有对应的关系,因此在 查找一个元素时,必须要经过关键 码的多次比较 。 顺序查找时间复杂度为 O(N) ,平衡树中…

基于java实用的音乐软件微信小程序的设计与实现【附项目源码】分享

基于实用的音乐软件微信小程序的设计与实现: 源码地址:https://download.csdn.net/download/weixin_43894652/88842586 一、引言 随着移动互联网的普及和微信小程序的兴起,音乐类小程序成为了用户随时随地享受音乐的重要工具。本需求文档旨在详细阐述一…

mysql重构

力扣题目链接 列转行 SELECT product_id, store1 store, store1 price FROM products WHERE store1 IS NOT NULL UNION SELECT product_id, store2 store, store2 price FROM products WHERE store2 IS NOT NULL UNION SELECT product_id, store3 store, store3 price FROM p…

Notepad++从文件夹查找文本内容

目录 一、背景二、Notepad搜索2.1 测试用例2.2 操作说明 一、背景 在日常的办公、学习或编程中,我们时长会遇到需要在大量文件中搜索特定文本内容的情况: 无论是快速定位某个项目中的代码片段;还是检索文档资料库中的相关信息等。 掌握如何…

AttributeError: cannot assign module before Module.__init__() call

原因 调用了自定义的类,但是在自定义的类的__init__函数下面没有写super( XXX, self ).init() 错误案例 import torch import torch.nn as nnclass SelfAttention(nn.Module):""" Self-Attention """def __init__(self, n_head, d…

MySQL 数据库 下载地址 国内阿里云站点

mysql安装包下载_开源镜像站-阿里云 以 MySQL 5.7 为例 mysql-MySQL-5.7安装包下载_开源镜像站-阿里云

【深度学习】深度估计,Depth Anything Unleashing the Power of Large-Scale Unlabeled Data

论文标题:Depth Anything Unleashing the Power of Large-Scale Unlabeled Data 论文地址:https://arxiv.org/pdf/2401.10891.pdf 项目主页:https://depth-anything.github.io/ 演示地址:https://huggingface.co/spaces/LiheYoung…

23.1 微服务理论基础

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

C#,图论与图算法,图着色问题(Graph Coloring)的威尔士-鲍威尔(Welch Powell Algorithm)算法与源代码

Welsh, D.J.A. and Powell, M.B. (1967) An Upper Bound for the Chromatic Number of a Graph and Its Application to Timetabling Problems. 《The Computer Journal》, 10, 85-86. 《The Computer Journal》 1 图着色算法概述 1967年,Welsh和Powell算法引入了…

vivo统一接入网关VUA转发性能优化实践

作者:vivo 互联网服务器团队 - Qiu Xiangcun 本文将探讨如何通过使用Intel QuickAssist Technology(QAT)来优化VUA的HTTPS转发性能。我们将介绍如何使用QAT通过硬件加速来提高HTTPS转发的性能,并探讨QAT在不同应用场景中的表现。最…

每日学习笔记:C++ 11的Tuple

#include <tuple> Tuple介绍(不定数的值组--可理解为pair的升级版) 定义 创建 取值 初始化 获取tuple元素个数、获取tuple某元素类型、将2个tuple类型串接为1个新tuple类型