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

数据结构初阶之队列的介绍与队列的实现

一、概念与结构

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

二、队列的实现

项目创建的时候,要创建一个头文件(.h)Queue.h ,两个源文件(.c)Queue.c ,test.c 。Queue.h 用于定义结构体和声明函数;Queue.c 用于实现函数;test.c 用于测试函数,每实现一个函数要进行相应的测试。编写代码过程中要勤测试,避免写出大量代码后再测试,如果出现问题,问题无从定位。

1、Queue.h

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>


//定义结点的结构
typedef int DataType;
typedef struct QueueNode
{
    DataType* data;
    struct QueueNode* next;
}QueueNode;

//定义队列的结构
typedef struct Queue
{
    QueueNode* phead;
    QueueNode* ptail;
    int size;
}Queue;

//初始化队列
void Init_Queue(Queue* pq);

//判断队列是否为空
bool Empty_Queue(Queue* pq);

//销毁队列
void Destory_Queue(Queue* pq);

//入队—队尾入
void Push_Queue(Queue* pq, DataType x);

//出队—队头出
void Pop_Queue(Queue* pq);

//取队头数据 
DataType Get_Head_Queue(Queue* pq);

//取队尾数据 
DataType Get_Tail_Queue(Queue* pq);

//求队列有效元素个数 
int Size_Queue(Queue* pq);

2、Queue.c

#include"Queue.h"

//初始化队列
void Init_Queue(Queue* pq)
{
    assert(pq);
    pq->phead = pq->ptail = NULL;
    pq->size = 0;
}

//判断队列是否为空
bool Empty_Queue(Queue* pq)
{
    assert(pq);
    return pq->phead == NULL;
}

//销毁队列
void Destory_Queue(Queue* pq)
{
    assert(pq);
    QueueNode* pcur = pq->phead;
    while (pcur)
    {
        QueueNode* next = pcur->next;
        free(pcur);
        pcur = NULL;
        pcur = next;
    }
    pq->phead = pq->ptail = NULL;
    pq->size = 0;
}

//入队列—队尾入
void Push_Queue(Queue* pq, DataType x)
{
    assert(pq);
    QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
    if (!newnode)
    {
        perror("malloc fail!");
        exit(1);
    }
    newnode->data = x;
    newnode->next = NULL;

    //若队列为空
    if (!pq->phead)
    {
        pq->phead = pq->ptail = newnode;
    }
    //队列不为空
    else
    {
        pq->ptail->next = newnode;
        pq->ptail = pq->ptail->next;
    }
    pq->size++;
}

//出队—队头出
void Pop_Queue(Queue* pq)
{
    assert(!Empty_Queue(pq));
    //只有一个结点的情况
    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--;
}

//取队头数据 
DataType Get_Head_Queue(Queue* pq)
{
    assert(!Empty_Queue(pq));
    return pq->phead->data;
}

//取队尾数据 
DataType Get_Tail_Queue(Queue* pq)
{
    assert(!Empty_Queue(pq));
    return pq->ptail->data;
}

//求队列有效元素个数 
int Size_Queue(Queue* pq)
{
    return pq->size;
}

test.c自行测试,这里不予提供。


http://www.kler.cn/a/521121.html

相关文章:

  • 【深度之眼cs231n第七期】笔记(三十一)
  • 卡特兰数学习
  • npm:升级自身时报错:EBADENGINE
  • 开源项目Umami网站统计MySQL8.0版本Docker+Linux安装部署教程
  • 【数据结构】_链表经典算法OJ:合并两个有序数组
  • SpringBoot中Excel表的导入、导出功能的实现
  • 嵌入式学习笔记-杂七杂八
  • Qt调用FFmpeg库实时播放UDP组播视频流
  • 51单片机入门_02_C语言基础0102
  • iOS开发 SDWebImage加载webp动图以及加载大量动图
  • USB 3.1 Legacy Cable and Connector笔记
  • World of Warcraft [CLASSIC] Jewelcrafting Gemstone 2
  • Java中的依赖注入(可以不使用@Autowired注解)
  • 蓝桥杯之c++入门(一)【数据类型】
  • 信息系统管理工程师第6-8章精讲视频及配套千题通关双双发布,附第14章思维导图
  • 哈希表的使用
  • 使用PyTorch实现逻辑回归:从训练到模型保存与加载
  • MySQL 8 不开通 CLONE 插件,建立主从关系
  • mybatis(78/134)
  • 使用QSqlQueryModel创建交替背景色的表格模型
  • 技术速递|.NET 9 中的 OpenAPI 文档生成
  • 【大数据】数据治理浅析
  • 想品客老师的第七天:闭包和作用域
  • 代码随想录算法训练营day30(补0123)
  • 基于 Ansible 的 Linux 服务器自动化运维实战
  • Java Web-Cookie与Session