当前位置: 首页 > 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;
}

我是云边有个稻草人

期待与你的下一次相遇!

http://www.lryc.cn/news/419983.html

相关文章:

  • 《决胜B端 产品经理升级之路》 知识点总结
  • 2024年6月 青少年python一级等级考试真题试卷
  • TCFormer:通过标记聚类Transformer实现视觉识别
  • haproxy实现七层负载均衡详解(基本配置与算法)
  • 海量日志数据收集监控平台应该怎么设计和实现
  • Windows图形界面(GUI)-MFC-C/C++ - CSliderCtrl
  • 常见中间件漏洞复现之【WebLogic】!
  • Linux服务器中限制远程IP登录的深入指南
  • 卫星通信中的拥塞控制算法
  • 全网​​​​​​​​超详细haproxy七层代理
  • Docker日志文件全局配置
  • bia文件中码偏差对实时PPP解算分析
  • 探索list与iterator的区别及yield的用法
  • github技巧和bug解决方法短篇收集
  • 学习笔记五:在k8s中安装EFK组件(elasticsearch+fluentd+kibana)
  • Golang编译-如何忽略某些文件去编译
  • 有哪些适合中型企业的人力资源管理系统推荐?
  • 活动回顾|首次 Cloudberry Database Meetup · 北京站成功举办
  • C语言 软件设计的七大原则,及其应用案例
  • 初学嵌入式-C语言常犯错误详解
  • Golang 语法入门
  • Filebeat+Kafka+ELK
  • Python 为Excel单元格设置填充\背景色 (纯色、渐变、图案)
  • 家里浮毛粉尘到处飞?宠物空气净化器出动帮你解决
  • 计算机网络ISO七层网络模型及TCP
  • 机器学习知识点全面总结
  • 【研发日记】嵌入式处理器技能解锁(三)——TI C2000 DSP的C28x内核
  • LeetCode.27.移除元素
  • redis面试(十二)可重入锁总结
  • 软件测试知识点3