数据结构——队列(链表实现)

一、队列的特点

先进先出

二、队列的代码

typedef int QDataType;

// 链式结构:表示队列 
typedef struct QListNode
{
    struct QListNode* next;
    QDataType data;
}QNode;

// 队列的结构 
typedef struct Queue
{
    QNode* front; //指向队列的第一个结点
    QNode* rear;//指向队列的最后一个结点
    int size;//记录队列中一共有几个元素
}Queue;

// 初始化队列 
void QueueInit(Queue* q);
// 队尾入队列 
void QueuePush(Queue* q, QDataType data);
// 队头出队列 
void QueuePop(Queue* q);
// 获取队列头部元素 
QDataType QueueFront(Queue* q);
// 获取队列队尾元素 
QDataType QueueBack(Queue* q);
// 获取队列中有效元素个数 
int QueueSize(Queue* q);
// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* q);
// 销毁队列 
void QueueDestroy(Queue* q);


    
// 初始化队列 
void QueueInit(Queue* q)
{
    assert(q);
    q->front = NULL;  //初始化为NULL
    q->rear = NULL;//初始化为NULL
    q->size = 0;  //初始化个数为0
}

// 队尾入队列 
void QueuePush(Queue* q, QDataType data)
{
    assert(q);

    QNode* newnode = (QNode*)malloc(sizeof(QNode));//申请新的结点
    if (newnode == NULL)
    {
        perror("malloc fail");
        return;
    }
    newnode->data = data; 
    newnode->next = NULL;

    if (q->front == NULL)  //如果front指针指向的是NULL,说明插入前队列是空队列
    {
        q->front = newnode;
        q->rear = newnode;
    }
    else        //front指向的不是NULL,说明不是空队列
    {
        q->rear->next = newnode;
        q->rear = newnode;
    }
    q->size++;  //插入完,个数加1
}

// 队头出队列 
void QueuePop(Queue* q)//出队就是头删
{
    assert(q);
    assert(q->size != 0);//队列不为空

    QNode* head = q->front;  //找到头结点
    if (head->next == NULL)//如果出队之前,前队列只有一个结点  
    {
        free(head);   //释放头结点,后front 和rear都要指向NULL,表示现在是空队列
        head = NULL;   
        q->front = q->rear = NULL;
        q->size = 0;     //个数置为0
        return; 
    }
    else   //出队前,队列有两个及其以上的结点数
    {
        QNode* del = head;  
        head = head->next; //更新头结点
        free(del);  
        del = NULL;
        q->front = head;   //将front 指向更新后的头结点
        q->size--;//个数减1
    }
}

// 获取队列头部元素 
QDataType QueueFront(Queue* q)
{
    assert(q);

    return q->front->data;
}

// 获取队列队尾元素 
QDataType QueueBack(Queue* q)
{
    assert(q);

    return q->rear->data;
}

// 获取队列中有效元素个数 
int QueueSize(Queue* q)
{
    assert(q);

    return q->size;
}

// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 
int QueueEmpty(Queue* q)
{
    assert(q);

    if (q->front == NULL)//队列为空,返回1
        return 1;
    else
        return 0;
}

// 销毁队列 
void QueueDestroy(Queue* q)
{
    assert(q);

    QNode* del = q->front;  //如果是空队列,就直接返回NULL,不要释放结点
    if (del == NULL)
    {
        ;
    }
    else
    {
        QNode* cur = del->next;
        while (del != NULL)    //逐个释放结点
        {

            free(del);
            del = cur;
            if (cur != NULL)
                cur = cur->next;
        }
    }
    //队头指针和队尾指针都是要置NULL的,size都是要置为0
    q->front = q->rear = NULL;
    q->size = 0;
}

三、队列的函数测试

1.取队头函数 QueueFront

int main()
{
    Queue Q;

    QueueInit(&Q);// 初始化队列 
    
    QueuePush(&Q, 1);// 队尾入队列 
    QueuePush(&Q, 2);// 队尾入队列 
    QueuePush(&Q, 3);// 队尾入队列 
    QueuePush(&Q,4);// 队尾入队列 

  
    QDataType x= QueueFront(&Q);// 获取队列头部元素 
printf("队头元素是%d \n", x);

QueueDestroy(&Q);// 销毁队列

    return 0;
}

结果:

 

2.取队尾函数QueueBack

int main()
{
    Queue Q;

    QueueInit(&Q);// 初始化队列 
    
    QueuePush(&Q, 1);// 队尾入队列 
    QueuePush(&Q, 2);// 队尾入队列 
    QueuePush(&Q, 3);// 队尾入队列 
    QueuePush(&Q,4);// 队尾入队列 

    QDataType y= QueueBack(&Q); // 获取队列队尾元素 
  printf("队尾元素是%d \n", y);
    
QueueDestroy(&Q);// 销毁队列

    return 0;
}

 结果:

3.求队列中元素个数 函数 QueueSize(&Q)

int main()
{
    Queue Q;

    QueueInit(&Q);// 初始化队列 
    
    QueuePush(&Q, 1);// 队尾入队列 
    QueuePush(&Q, 2);// 队尾入队列 
    QueuePush(&Q, 3);// 队尾入队列 
    QueuePush(&Q,4);// 队尾入队列 

    int z= QueueSize(&Q); // 获取队列中有效元素个数 
printf("一共有%d个成员 \n", z);

QueueDestroy(&Q);// 销毁队列

    return 0;
}

 结果;

 4.出队函数QueuePop(头删)

int main()
{
    Queue Q;

    QueueInit(&Q);// 初始化队列 
    
    QueuePush(&Q, 1);// 队尾入队列 
    QueuePush(&Q, 2);// 队尾入队列 
    QueuePush(&Q, 3);// 队尾入队列 
    QueuePush(&Q,4);// 队尾入队列 

   
    QueuePop(&Q);// 队头出队列 
QueuePop(&Q);// 队头出队列 


while (!QueueEmpty(&Q))
{
    printf("%d ", QueueFront(&Q));
    QueuePop(&Q);
}

    return 0;
}

结果:

原来 1 2 3 4 入队  出队两次, 变成  3 4 .

 

5.判断队列是否为空的函数QueueEmpty(不为空就会依次出队)

int main()
{
    Queue Q;

    QueueInit(&Q);// 初始化队列 
    
    QueuePush(&Q, 1);// 队尾入队列 
    QueuePush(&Q, 2);// 队尾入队列 
    QueuePush(&Q, 3);// 队尾入队列 
    QueuePush(&Q,4);// 队尾入队列 

   
    while (!QueueEmpty(&Q))  //队列不为空,就会依次出队
  {
    printf("%d ", QueueFront(&Q));
    QueuePop(&Q);//依次出队
  }

    printf("所有成员出完队后\n");
    int w= QueueEmpty(&Q);
if (w != 0)
    printf("队列已经空了");

    return 0;
}

结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/628190.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于uniapp+vue3+ts开发微信小程序项目实战

🚀 作者 :“二当家-小D” 🚀 博主简介:⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人,8年开发架构经验,精通java,擅长分布式高并发架构,自动化压力测试,微服务容器化k…

香港电讯高效网络,助力新消费品牌抓住拓展香港市场新风口

自今年初香港与内地全面恢复通关,两地同胞跨境消费热潮持续升温。港人“北上”消费掀起风潮的同时,香港市场也成为内地新消费品牌拓展的热门目标。从糕点、茶饮、连锁餐饮到服饰,越来越多内地品牌进驻香港。新消费品牌要想在香港开设门店&…

气膜建筑会漏气吗—轻空间

气膜建筑作为一种创新的建筑形式,其主要结构依靠充气系统提供源源不断的风力,以维持内部气压,从而支撑起整个膜体,抵御外部的风雪荷载。然而,气膜建筑能否保持完全的密封性,是否会漏气,是许多用…

python批量生成验证码,python生成验证码

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.总结 一.前言 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Human

国标GB28181协议EasyCVR视频汇聚平台获取设备录像仅展示部分片段的原因排查

国标GB28181协议EasyCVR安防平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力,平台支持7*24小时实时高清视频监控,能同时播放多路监控视频流&#xf…

抖店曝光率高,转化低,不知道怎么提升转化率?试试这四个方法

大家好,我是醒醒团队电商花花。 我们现在做抖音小店的商家或多或少都会遇到不出单,转化低的各种问题。 明明店铺的曝光不低,访客也不少,就是没转化。 下面我根据我们做店的经验,给大家分享一些问题所在,…

从零开始成为网络安全工程师:提高竞争力的秘诀

在当今数字化和互联网化的时代,网络安全工程师的职责越来越重要。然而,网络安全行业发展迅速,竞争也越来越激烈。要成为一名有竞争力的网络安全工程师,需要有一定的技能和经验,同时要不断提升自己的能力。下面是坤哥结…

全国最新行政区划数据,包括省、市、区、街道四个级别(2024年5月15日-来源与腾讯地图)

本数据集涵盖了中国全国范围内的行政区划信息,包括省、市、区、街道四个级别,共计42387条记录。数据采用Excel格式存储,可轻松导入数据库进行使用。 每条记录包含以下关键信息: 行政区域编码:每个行政区域都有唯一的…

项目组GIT操作规范

分支规范 在开发过程中,一般会存在以下几种分支: main分支(master) master为主分支,也是用于部署生产环境的分支,一般由 dev 以及 fixbug分支合并,任何时间都不能直接修改代码。dev分支 develop 为开发分支&#xff…

精酿啤酒:精酿文化的传承者与创新者

在啤酒的世界中,精酿啤酒是一种与众不同的文化现象。这种文化源于对啤酒品质的追求和对传统工艺的尊重,但在不断发展中也不断涌现出创新。作为精酿啤酒的品牌,Fendi club啤酒不仅是这种文化的传承者,更是创新者。 Fendi club啤酒始…

vue下载文件,获取header头文件名乱码,下载文件名有下划线的解决

后台以数据流将文件返回,将文件名放在header头里,是中文名,有乱码,如图 访问网络使用的是axios,在 // 响应拦截器 service.interceptors.response.use((res) > {........ if (res.config.responseType blob) {//文…

智游剪辑1.5.0发布!

智游剪辑1.5.0发布了,快来看看更新了啥功能吧! 主页卡片升级 现在功能卡片新增图标,比以前更好看更直观 我的收藏 遇到自己喜欢的功能直接点击收藏就可以了,后面我们就能快速找到这个功能 批量ncm转mp3功能 目前看后台有很多人…

【源头活水】顶刊解读!IEEE T-PAMI (CCF-A,IF 23.6)2024年46卷第二期

“问渠那得清如许,为有源头活水来”,通过前沿领域知识的学习,从其他研究领域得到启发,对研究问题的本质有更清晰的认识和理解,是自我提高的不竭源泉。为此,我们特别精选论文阅读笔记,开辟“源头…

2024江苏省赛 H. 完蛋,我被房产包围了 【费用流、分时图】

完蛋,我被房产包围了 n ≤ 200 , ∑ n ≤ 1 0 4 n \leq 200, \sum n \leq 10^4 n≤200,∑n≤104 求出最大利润 思路 每个代理商每次买房狂潮只能卖出 1 1 1 套房子,小红卖出一套房子贬值 1 1 1 元,小绿卖出一套房子贬值 ⌈ a i 10 ⌉ \…

vue3专栏项目 -- 五、权限管理(下)

1、创建Message组件 前面我们获取到了请求错误的信息,所以我们接下来做一个弹出框组件,让错误提示展示出来 我们把这个组件做成一个全局组件,它不仅可以显示错误的信息,还可以添加成功操作的信息,甚至还可以显示一个…

C# OpenCvSharp Demo - 最大内接圆

C# OpenCvSharp Demo - 最大内接圆 目录 效果 项目 代码 下载 效果 项目 代码 using OpenCvSharp; using System; using System.Diagnostics; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Windows.Forms; namespace OpenCvSh…

算法day07

第一题 30. 串联所有单词的子串 上题题意如下: 将w数组里面的字符串随机排列,只要在s字符串中找到相对应的w组成的字符串,则返回s中对应字符串首位元素的第一个下标; 有上述题意所知,解题思路如上一题故事&#xff0c…

React搭建-Next 学习-1

创建一个 Next.js 应用,node版本要高,16.5以上 npm淘宝镜像切为https://registry.npmmirror.com npm config set registry https://registry.npmmirror.com npx create-next-applatest//安装后 使用npm run dev 启动 Next.js 是围绕着 页面(pages&am…

如何启用WooCommerce商城快捷结帐:3 种简单方法

使用WooCommerce商城快捷结帐可帮助您提高商店的转化率。 70%的顾客同意在线商店的快速结账流程会鼓励他们完成购买。 在结账过程中您让购物者完成的步骤越多,他们完成该流程的可能性就越小。 解决方案是什么? 通过跳过默认的WooCommerce商城购物车页…

怎么看电脑是固态还是机械硬盘?数据丢失怎么办

在数字化时代,电脑硬盘作为数据存储的核心部件,其类型直接关系到数据读写速度和存储效率。固态硬盘(SSD)与机械硬盘(HDD)作为目前市场上主流的两种硬盘类型,各有其优缺点。然而,对于…