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

数据结构(队列)

数据结构(队列)

什么是队列?

  • 队列和栈类似,也是一类特殊的线性表。特殊之处也是在于操作上。
  • 队列:只允许在一端进行插入数据操作(入队),在另一端进行删除数据操作(出队)的特殊的线性表。
  • 具有先进先出,后进后出的特点。
  • 进行插入操作(入队)的一端称为队尾。进行删除操作(出队)的一端称为队头。

在这里插入图片描述

队列的意义(作用)

  • 在这里插入图片描述

队列的实现

  • 和栈类似,也有两种实现方式。一种是数组,也就是顺序表,一种是链表。

  • 两种方式都是可以的,不过相比之下,链表更优一些。

  • 因为队列是在队头出数据,也就是头部删除数据,那么顺序表要删除头部数据需要一个个的移动数据进行覆盖。所以我们优先选择链表实现。

  • 链表类型的选择

  • 在这里插入图片描述

实现代码

  • 头文件.h
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

typedef int QDateType;
typedef struct QueueNode
{
    struct QueueNode* next;
    QDateType date;
}QNode;

typedef struct Queue
{
    QNode * head;
    QNode * tail;
    int size;
}Que;

//队列初始化
void QueueInit(Que* pq);
//队列销毁
void QueueDestroy(Que* pq);

//入队(尾部插入数据)
void QueuePush(Que* pq,QDateType x);
//出队(头部删除数据)
void QueuePop(Que* pq);

//获得队头节点的值
QDateType QueueFront(Que* pq);
//获得队尾节点的值
QDateType QueueBack(Que* pq);

//判断队列是否为空
bool QueueEmpty(Que* pq);
//获得队列的长度(有效元素个数)
int QueueSize(Que* pq);
  • 函数实现文件.c
#include "Queue.h"

//队列初始化
void QueueInit(Que* pq)
{
    assert(pq);

    pq->head=pq->tail=NULL;
    pq->size=0;
}
//队列销毁
void QueueDestroy(Que* pq)
{
    assert(pq);
    QNode* cur=pq->head;
    while(cur)
    {
        QNode *next=cur->next;
        free(cur);
        cur=next;
    }

    pq->head=pq->tail=NULL;
    pq->size=0;
}

//入队(尾部插入数据)
void QueuePush(Que* pq,QDateType x)
{
    assert(pq);

    QNode *newnode=(QNode*) malloc(sizeof (QNode));
    if(newnode==NULL)
    {
        perror("malloc failed");
        exit(-1);
    }

    newnode->next=NULL;
    newnode->date=x;

    if(pq->tail==NULL)
    {
        pq->head=pq->tail=newnode;
    }
    else
    {
        pq->tail->next=newnode;
        pq->tail=newnode;
    }

    pq->size++;
}
//出队(头部删除数据)
void QueuePop(Que* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));

    if(pq->head->next==NULL)
    {
        free(pq->head);
        pq->head=pq->tail=NULL;
    }
    else
    {
        QNode *next=pq->head->next;
        free(pq->head);
        pq->head=next;
    }

    pq->size--;

}

//获得队头节点的值
QDateType QueueFront(Que* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));

    return pq->head->date;
}
//获得队尾节点的值
QDateType QueueBack(Que* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));

    return pq->tail->date;
}

//判断队列是否为空
bool QueueEmpty(Que* pq)
{
    assert(pq);

    return pq->head==NULL;
}
//获得队列的长度(有效元素个数)
int QueueSize(Que* pq)
{
    assert(pq);

    return pq->size;
}

函数解析

  • 队列结构
typedef int QDateType;
typedef struct QueueNode
{
    struct QueueNode* next;
    QDateType date;
}QNode;

typedef struct Queue
{
    QNode * head;
    QNode * tail;
    int size;
}Que;

在这里插入图片描述

  • 队列初始化
//队列初始化
void QueueInit(Que* pq)
{
    assert(pq);

    pq->head=pq->tail=NULL;
    pq->size=0;
}

在这里插入图片描述

  • 队列销毁
//队列销毁
void QueueDestroy(Que* pq)
{
    assert(pq);
    QNode* cur=pq->head;
    while(cur)
    {
        QNode *next=cur->next;
        free(cur);
        cur=next;
    }

    pq->head=pq->tail=NULL;
    pq->size=0;
}

在这里插入图片描述

  • 入队(尾部插入数据)
//入队(尾部插入数据)
void QueuePush(Que* pq,QDateType x)
{
    assert(pq);

    QNode *newnode=(QNode*) malloc(sizeof (QNode));
    if(newnode==NULL)
    {
        perror("malloc failed");
        exit(-1);
    }

    newnode->next=NULL;
    newnode->date=x;

    if(pq->tail==NULL)
    {
        pq->head=pq->tail=newnode;
    }
    else
    {
        pq->tail->next=newnode;
        pq->tail=newnode;
    }

    pq->size++;
}

在这里插入图片描述

  • 出队(头部删除数据)
//出队(头部删除数据)
void QueuePop(Que* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));

    if(pq->head->next==NULL)
    {
        free(pq->head);
        pq->head=pq->tail=NULL;
    }
    else
    {
        QNode *next=pq->head->next;
        free(pq->head);
        pq->head=next;
    }

    pq->size--;

}

在这里插入图片描述

  • 获得队头节点的值
//获得队头节点的值
QDateType QueueFront(Que* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));

    return pq->head->date;
}
  • 这个不多说。

  • 获得队尾节点的值

//获得队尾节点的值
QDateType QueueBack(Que* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));

    return pq->tail->date;
}
  • 不多说了。

  • 判断队列是否为空

//判断队列是否为空
bool QueueEmpty(Que* pq)
{
    assert(pq);

    return pq->head==NULL;
}
  • 连头都没有,那是不是空的?或者pq->tail==NULL。也可以判空。

  • 获得队列的长度(有效元素的个数)

//获得队列的长度(有效元素个数)
int QueueSize(Que* pq)
{
    assert(pq);

    return pq->size;
}
  • 不多说,每次插入删除数据,都会带上它变化的。它就是用来记录元素个数的。
  • 那么队列的基本知识就基本完成了。

相关文章:

  • DeepSeek-R1本地化部署(Mac)
  • 【原创】springboot+vue实验室预约管理系统设计与实现
  • 增删改查 数据下载 一键编辑 删除
  • SpringSecurity认证授权完整流程
  • 城市霓虹灯夜景拍照后期Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • instr,locate是否使用索引实验
  • DeepSeek【部署 03】客户端应用ChatBox、AnythingLLM及OpenWebUI部署使用详细步骤
  • 并发编程——累加器
  • 【华三】STP端口角色与状态深度解析
  • 仿函数 greater less
  • C++关键字:typename 用于依赖名消歧器(disambiguator)
  • C++进阶知识7 封装map和set
  • 分享能在线运行C语言的网站
  • Bitbucket SSH 访问设置指南
  • Vue3实战学习(Vue环境配置、快速上手及卸载、下载安装Node.js超详细教程(2025)、npm配置淘宝镜像)(1)
  • 常见Web应用源码泄露问题
  • 我的世界1.20.1forge模组开发(8)——自定义实体、AI
  • Hugging Face 推出 FastRTC:实时语音视频应用开发变得得心应手
  • H.264,H.265,H.266标准技术改进
  • 基于字符的卷积网络在文本分类中的应用与探索
  • 自适应网站建设/推广策划
  • 昆钢建设集团网站/成都seo培训
  • 哪些做任务的网站靠谱/百度一下电脑版首页网址
  • 网站建设计划书/八上数学优化设计答案
  • 上海建设工程咨询协会/广东seo推广
  • 做外贸网站应该关注哪些地方/百度网址大全下载