初阶数据结构【TOP】-6. 队列的实现

embedded/2024/12/22 13:17:32/

文章目录

  • 前言
  • 一、什么是队列?
  • 二、队列的选择
  • 二、队列的实现
  • 总结


前言

本篇文章笔者将会对 “ 队列 ” 进行细致的讲解 , 从队列的介绍 - 队列的选择 - 队列的实现 , 逐一进行。

一、什么是队列?

概念:只允许在一端进行插入数据的操作 , 另一端删除数据的操作的一种特殊线性表 。
队头:删除数据的一端叫做 :队头(出队)
队尾:插入数据的一端叫做 :队尾(入队)
特点:FIFO(First In First Out) 先进先出

图例:
队列展示图

区分是在一端进行操作队列两端进行操作


二、队列的选择

要实现队列该如何选择呢 ? 数组? 链表?
数组:队列要符合先进先出 ,两端进行操作 ,而用数组实现一端插入一端删除是有难度的 , 在考虑删除时队列每出一个元素 ,该元素所在的空间就不能使用了 ,会造成空间浪费。

链表:用链表实现两端操作就很方便 ,队列的实现大多选用链表实现的方式。
选择:因为我们只需要进行头和尾的操作 , 所以相比双向链表我们倾向 用单链表来实现队列。


二、队列的实现

Queue.h


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>//队列的声明 
//队列的特点 : 先进先出 
//队头  队尾 //单链表实现
typedef int QueueDateType;typedef struct QueueNode
{QueueDateType x;struct Queue* next;}QNode;typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;//改结构体即可达到改链表的目的//初始化队列
void QueueInit(Queue* que);//队尾插入
void QueuePush(Queue* que , QueueDateType x);
//队头删除
void QueuePop(Queue* que);
//获取队尾元素
QueueDateType QueueBack(Queue* que);
//获取队头元素
QueueDateType QueueFront(Queue* que);
//获取队列中的有效元素
int QueueSize(Queue* que);
//队列判空
bool QueueEmpty(Queue* que);
//销毁队列
void QueueDestory(Queue* que);

Queue.c

#include "Queue.h"//初始化队列
void QueueInit(Queue* que)
{assert(que);que->phead = que->ptail = NULL;que->size = 0;
}//队尾插入
void QueuePush(Queue* que, QueueDateType x)
{assert(que);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fali!");exit(1);}newnode->x = x;newnode->next = NULL;if(que->phead == NULL){que->phead = que->ptail = newnode;}else{que->ptail->next = newnode;que->ptail = newnode;}que->size++;
}
//队头删除
void QueuePop(Queue* que)
{assert(que && que->size );//一个节点if(que->phead == NULL){free(que->phead);que->phead = que->ptail = NULL;}//多个节点else{QNode* next = que->phead->next;free(que->phead);que->phead = next;}que->size--;
}
//获取队尾元素
QueueDateType QueueBack(Queue* que)
{assert(que && que->ptail);return que->ptail->x;
}
//获取队头元素
QueueDateType QueueFront(Queue* que)
{assert(que && que->phead);return que->phead->x;
}
//获取队列中的有效元素
int QueueSize(Queue* que)
{assert(que);return que->size;
}
//队列判空
bool QueueEmpty(Queue* que)
{assert(que);return que->size == 0;
}
//销毁队列
void QueueDestory(Queue* que)
{assert(que);QNode* cur = que->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}que->phead = que->ptail = NULL;que->size = 0;
}

Test.c

#include "Queue.h"int main()
{Queue q; // 创建一个队列QueueInit(&q);QueuePush(&q, 1);QueuePush(&q, 2);QueuePop(&q);QueuePush(&q, 3);QueuePush(&q, 4);bool ret = QueueEmpty(&q);printf("Empty ..result = %d\n", ret);int num = QueueSize(&q);printf("size = %d\n", num);int n = QueueBack(&q);printf("QueueBack = %d\n", n);int m = QueueFront(&q);printf("QueueFront = %d\n", m);printf("\n");while (!QueueEmpty(&q)){//取队头元素int ret = QueueFront(&q);printf("%d ", ret);QueuePop(&q);}printf("\n");return 0;}

总结

以上是关于队列的相关知识,希望对大家有所帮助!


http://www.ppmy.cn/embedded/111181.html

相关文章

工厂模式(二):工厂方法模式

一、概念 工厂方法模式&#xff08;Factory Method&#xff09;&#xff0c;定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。从而使得系统更加灵活。客户端可以通过调用工厂方法来创建所需的产品&#xff0c;而不必…

ICLR2024: 大视觉语言模型中对象幻觉的分析和缓解

https://arxiv.org/pdf/2310.00754 https://github.com/YiyangZhou/LURE 背景 对象幻觉&#xff1a;生成包含图像中实际不存在的对象的描述 早期的工作试图通过跨不同模式执行细粒度对齐&#xff08;Biten et al.&#xff0c;2022&#xff09;或通过数据增强减少对象共现模…

sqli-labs靶场自动化利用工具——第13关

文章目录 概要整体架构流程技术细节执行效果小结 概要 Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生&#xff0c;或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢&#xff1f;可能有些人会说不是有sqlmap&#…

android.database.sqlite.SQLiteException: no such table

android.database.sqlite.SQLiteException: no such table 这个异常通常表明你的 SQLite 数据库中不存在你试图访问的表。这种情况可能由几个原因引起&#xff1a; 数据库表未创建&#xff1a;你可能没有在应用的数据库初始化代码中创建这个表。确保在你的数据库帮助类&#xf…

[项目][WebServer][项目介绍及知识铺垫][上]详细讲解

目录 1.何为WWW?2.HTTP分层1.整体2.细节3.DNS?4.协议之间是如何协同运作的&#xff1f; 3.Http相关概念1.特点2.URI && URL && URN3.HTTP URL格式 1.何为WWW? WWW是环球信息网的缩写&#xff0c;常简称为Web分为Web客户端和Web服务器程序&#xff0c;WWW可…

SpringMvc 完整上传文件流程(Ajax请求)头像,图片上传

1、config包下的操作 1.1、创建MyWebApplicationInit类 如何创建第一个SpringMvc步骤 以配置类的形式代替xml文件&#xff08;点击链接查看&#xff09; 1.2、设置文件大小&#xff08;自定义&#xff09; 1.3、创建SpringMvcConfig类 并实现 WebMvcConfigurer接口 EnableW…

LabVIEW如何确保采集卡稳定运行

在LabVIEW开发中&#xff0c;如何确保硬件采集卡稳定运行&#xff0c;特别是长期采集电压信号&#xff0c;是系统稳定性的重要考虑因素。用户在使用采集卡时&#xff0c;可能需要频繁进行开始、停止和重新采集的操作&#xff0c;这对硬件和软件提出了高要求。下面介绍实现长期稳…

qt --如何获取本地联网的网口mac地址

单独的获取某一个网卡的mac地址 在代码里 可能出现意料之外的bug 如果你本地的网卡较多 QList< QString > ABC::getMac() {QList< QNetworkInterface > nets QNetworkInterface::allInterfaces(); // 获取所有网络接口列表int nCnt nets.count();QList< QStr…