当前位置: 首页 > news >正文

【数据结构初阶】队列

hello!

目录

一、概念与结构

二、队列的实现

Queue.h

Queue.c

test.c


一、概念与结构

1、概念:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特性。

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

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

2、队列底层结构的选择

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

二、队列的实现

Queue.h

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>//定义队列结点的结构
typedef int QDataType;
typedef struct QueueNode
{QDataType data;struct QueueNode* next;
}QueueNode;//定义队列的结构
typedef struct Queue
{struct QueueNode* phead;struct QueueNode* ptail;int size;   //保存队列有效数据的个数
}Queue;//初始化
void QueueInit(Queue* pq);//入队列
void QueuePush(Queue* pq,QDataType x);//判空
bool QueueEmpty(Queue* pq);//出队列
void QueuePop(Queue* pq);//取队头数据
QDataType QueueFront(Queue* pq);//取队尾数据
QDataType QueueBack(Queue* pq);//队列有效元素个数
int QueueSize(Queue* pq);//销毁队列
void  QueueDestroy(Queue* pq);

Queue.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"//初始化
void QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;pq->size = 0;
}//入队列
void QueuePush(Queue* pq, QDataType x)
{assert(pq);//申请新结点QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL){perror("malloc fail!");exit(1);}newnode->data = x;newnode->next = NULL;if (pq->phead == NULL){//若队列为空pq->phead = pq->ptail = newnode;}else{//若队列不为空pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}//判空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}//出队列
void QueuePop(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));//若队列里只有一个结点,避免ptail变成野指针if (pq->phead == pq->ptail){free(pq->phead);pq->phead = pq->ptail = NULL;}else{//队列不止一个结点QueueNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}--pq->size;
}//取队头数据
QDataType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->phead->data;
}//取队尾数据
QDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->ptail->data;
}//队列有效元素个数
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}//销毁队列
void  QueueDestroy(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));QueueNode* pcur = pq->phead;while (pcur){QueueNode* next = pcur->next;free(pcur);pcur = next;}pq->ptail = pq->phead = NULL;pq->size = 0;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"void QueueTest01()
{Queue q;QueueInit(&q);QueuePush(&q, 1);QueuePush(&q, 2);QueuePush(&q, 3);QueuePush(&q, 4);QueuePop(&q);/*QueuePop(&q);QueuePop(&q);QueuePop(&q);*/printf("head:%d\n",QueueFront(&q));printf("tail:%d\n",QueueBack(&q));printf("size:%d\n",QueueSize(&q));QueueDestroy(&q);}int main()
{QueueTest01();return 0;
}

我是云边有个稻草人

期待与你的下一次相遇!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • K8S Ingress 常用配置
  • vue项目打包问题
  • 题解:力扣1567 - 返回乘积为正数的最长子数组
  • 串行并行数据转换
  • WEB渗透Bypass篇-常规函数绕过
  • 网络安全与国家安全
  • 力扣Hot100-994腐烂的橘子
  • 007 | 期权定价与布莱克-斯科尔斯计算
  • git pull 注意事项
  • 【hadoop】常用命令
  • 四、数字图像处理Matlab实验 第二章 数字图像基础
  • 猫头虎推荐:人类通向AGI之路 史上最重磅的20篇论文你值得学习
  • Docker快速入门指南
  • 简单介绍一下 git reflog
  • 10、MySQL-索引
  • [译]Python中的类属性与实例属性的区别
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【翻译】babel对TC39装饰器草案的实现
  • python 学习笔记 - Queue Pipes,进程间通讯
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • vue:响应原理
  • 动态规划入门(以爬楼梯为例)
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 来,膜拜下android roadmap,强大的执行力
  • 什么是Javascript函数节流?
  • 协程
  • 1.Ext JS 建立web开发工程
  • Java性能优化之JVM GC(垃圾回收机制)
  • ###STL(标准模板库)
  • #stm32整理(一)flash读写
  • $.proxy和$.extend
  • (04)odoo视图操作
  • (floyd+补集) poj 3275
  • (ibm)Java 语言的 XPath API
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (ZT)一个美国文科博士的YardLife
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (四)汇编语言——简单程序
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • .gitignore文件—git忽略文件
  • .Net Core缓存组件(MemoryCache)源码解析
  • .Net 知识杂记
  • [20161101]rman备份与数据文件变化7.txt
  • [ACP云计算]易混淆知识点(考题总结)
  • [AIGC] 广度优先搜索(Breadth-First Search,BFS)详解
  • [Android]使用Android打包Unity工程
  • [C++][opencv]基于opencv实现photoshop算法可选颜色调整
  • [C++]类和对象(中)
  • [C++提高编程](三):STL初识
  • [C语言]——分支和循环(4)
  • [ESP32] 编码旋钮驱动
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART