【数据结构】队列的实现(链式)

文章目录

  • 队列
    • 1.队列的概念及结构
      • 概念
      • 结构
    • 2.队列的实现(链式结构)
      • 队列定义
      • 初始化队列
      • 入队
      • 出队
      • 获取队头元素
      • 获取队尾元素
      • 销毁队列
      • 判断队列是否为空
      • 队列有效个数
    • 完整代码(包含测试代码)
      • Queue.h
      • Queue.c
      • test.c

队列

1.队列的概念及结构

概念

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

结构

队列也可以数组和链表的结构实现:

队列的顺序结构
入队,直接下标访问,时间复杂度为O(1)
出队,挪动数据覆盖,时间复杂度为O(N)

队列的链式结构
定义两个指针,队头指针指向第一个节点,队尾指针指向尾节点
入队(尾插),时间复杂度为O(1)
出队(头删),时间复杂度为O(1)

所以使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
在这里插入图片描述

2.队列的实现(链式结构)

首先新建一个工程:

Queue.h(队列的类型定义、接口函数声明、引用的头文件)
Queue.c(队列接口函数的实现)
test.c(主函数、测试栈各个接口功能)

完整的代码放在后面(包括测试代码),这里就不会展示测试的效果图。大家可以自己别敲边按测试代码测试。图解会写的很详细的,么么😙

队列定义

typedef int QDataType;//队列结点结构
typedef struct QlistNode 
{QDataType val;//结点元素struct QlistNode* next;//结点指针
}QNode;//队列链式结构
typedef struct Queue
{QNode* phead;//队头指针QNode* ptail;//队尾指针int size;//元素个数
}Queue;

初始化队列

初始化这里很讲究的,如果不把两个指针放到结构体里面封装起来,单独来传,那这里很麻烦要用二级指针而且也不太好控制,但是如果用结构体封装起来我们访问这两指针就是访问结构体的成员,要修改就直接修改指向结构体的指针pq就ok了
我们链表那里就讲过了传参的问题,我们实现无头链表的头插头删接口时,因为需要改变头指针的指向两种方法:
1、传二级指针
2、返回值(return)
现在又有了一种方法:
结构体封装起来

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

入队

这个其实就是链表的尾插

//入队
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));//动态申请一个结点if (newnode == NULL)//判断结点是否申请成功{perror("malloc fail");return;}newnode->val = x;newnode->next = NULL;if (pq->phead==NULL)//队列为空插入{pq->phead = pq->ptail = newnode;}else//队列有元素{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}

出队

这个也就是链表的头删

//出队
void QueuePop(Queue* pq)
{assert(pq);assert(pq->phead);//队列不能为空if (pq->phead->next==NULL)//队列只有一个元素{pq->ptail = NULL;}QNode* del = pq->phead;pq->phead = pq->phead->next;free(del);del = NULL;pq->size--;}

获取队头元素

//获取队头元素
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead);//队列不能为空return pq->phead->val;
}

获取队尾元素

//获取队尾元素
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->ptail);//队列不能为空return pq->ptail->val;
}

销毁队列

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

判断队列是否为空

//判断队列是否为空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;//pq->phead、pq->ptail两个用哪一个都行
}

队列有效个数

//队列有效个数
int QueueSize(Queue* pq)
{assert(pq);return pq->size;}

完整代码(包含测试代码)

Queue.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int QDataType;//队列结点结构
typedef struct QlistNode 
{QDataType val;//结点元素struct QlistNode* next;//结点指针
}QNode;//队列链式结构
typedef struct Queue
{QNode* phead;//队头指针QNode* ptail;//队尾指针int size;//元素个数
}Queue;//初始化队列
void QueueInit(Queue* pq);
//入队
void QueuePush(Queue* pq, QDataType x);
//出队
void QueuePop(Queue* pq);
//获取队头元素
QDataType QueueFront(Queue* pq);
//获取队尾元素
QDataType QueueBack(Queue* pq);
//销毁队列
void QueueDestroy(Queue* pq);
//判断队列是否为空
bool QueueEmpty(Queue* pq);
//队列有效个数
int QueueSize(Queue* pq);

Queue.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"queue.h"//初始化队列
void QueueInit(Queue* pq)
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}
//入队
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));//动态申请一个结点if (newnode == NULL)//判断结点是否申请成功{perror("malloc fail");return;}newnode->val = x;newnode->next = NULL;if (pq->phead==NULL)//队列为空插入{pq->phead = pq->ptail = newnode;}else//队列有元素{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}
//出队
void QueuePop(Queue* pq)
{assert(pq);assert(pq->phead);//队列为空中止if (pq->phead->next==NULL)//队列只有一个元素{pq->ptail = NULL;}QNode* del = pq->phead;pq->phead = pq->phead->next;free(del);del = NULL;pq->size--;}
//获取队头元素
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->val;
}
//获取队尾元素
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->ptail);return pq->ptail->val;
}
//销毁队列
void QueueDestroy(Queue* pq)
{assert(pq);QNode* pcur = pq->phead;while (pcur){QNode* next = pcur->next;free(pcur);pcur = next;}pcur = NULL;pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}
//判断队列是否为空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}
//队列有效个数
int QueueSize(Queue* pq)
{assert(pq);return pq->size;}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"int main()
{Queue Q;QueueInit(&Q);QueuePush(&Q, 1);QueuePush(&Q, 2);QueuePush(&Q, 3);QueuePush(&Q, 4);QueuePush(&Q, 5);//打印队列//while (!QueueEmpty(&Q))//{//	printf("%d ", QueueFront(&Q));//	QueuePop(&Q);//}//printf("\n");int r = QueueSize(&Q);printf("%d ", r);//printf("%d ", QueueBack(&Q));return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14.正交向量与子空间

文章目录 1. 四个子空间的相互关系2. 正交向量3. 无解方程求解 1. 四个子空间的相互关系 对于m行n列的矩阵A来说&#xff0c;矩阵A的行空间的秩等于矩阵A的列空间的秩 R a n k ( A ) R a n k ( A T ) r (1) Rank(A)Rank(A^T)r\tag{1} Rank(A)Rank(AT)r(1) A X 0 ; A T X …

HTTP代理可以应用在那些领域呢

HTTP代理是IP代理领域中一个重要组成部分&#xff0c;它基于HTTP协议传输&#xff0c;使用海外服务器帮助用户绕开访问限制&#xff0c;浏览查看海外资讯信息。 HTTP代理可以应用在哪些领域呢&#xff1f; 1.保护使用者隐私 当今越来越数据被上传到网络云端上&#xff0c;用户…

uniapp 微信小程序使用ec-canvas图表

微信小程序中使用到了ec-canvas图表&#xff0c;从DCloud插件市场中下载echarts-for-wx&#xff1b; 在uniapp项目中找到js-sdk文件夹&#xff0c;把其中的uni-ec-canvas放到要用的包的components中。 在文件中导入&#xff1a; 饼图&#xff1a; <template><view…

STM32入门_江协科技_5~6_OB记录的自学笔记_GPIO输出_LED流水灯_蜂鸣器

5. GPIO 输出 5.1. GPIO简介 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口可配置为8种输入输出模式引脚电平&#xff1a;0V~3.3V&#xff0c;部分引脚可容忍5V&#xff08;端口输入5V的电压&#xff0c;之前引脚定义表格中带FT标识的&#xff09…

计算思维的理解

2006年&#xff0c;卡内基梅隆大学周以真教授首次系统性地定义了计算思维。这一年&#xff0c;她在美国计算机权威期刊《Communications of the ACM》上发表了题为《Computational Thinking》的论文&#xff0c;由此开启了计算思维大众化的全新历程。 周以真&#xff08;Jeanne…

Android ndk获取手机内部存储卡的根目录方法

如下所示&#xff1a; 代码语言&#xff1a;javascript jclass envcls env- FindClass("android/os/Environment"); //获得类引用if (envcls nullptr) return 0;//找到对应的类&#xff0c;该类是静态的返回值是FilejmethodID id env- GetStaticMethodID(envcls,…

Windows / Linux 查看计算机支持的最大内存

该操作一般用不到&#xff0c;主要用于给计算机扩展内存用。 一、Windows 系统 以管理员身份运行 cmd 1、查看主板最大支持内存容量 wmic memphysical get maxcapacity /format:value将返回值值是以KB为单位的&#xff0c;除以 1024&#xff0c;再除以 1024&#xff0c;即…

单调栈练习

最大矩形面积 如果栈为空&#xff0c;或者新的元素是大于栈顶元素的&#xff0c;那么新来的元素不会破坏栈的单调性&#xff0c;那么就把这个柱子入栈。 特别注意&#xff1a;这里的s.empty()和s.top().height < a不能调换顺序&#xff0c;包括后面的判断也要先判断栈是否为…

【Qt问题】windeployqt如何提取Qt依赖库

往期回顾 【Qt问题】Qt Creator 如何链接第三方库-CSDN博客 【Qt问题】Qt 如何带参数启动外部进程-CSDN博客 【Qt问题】VS2019 Qt win32项目如何添加x64编译方式-CSDN博客 【Qt问题】windeployqt如何提取Qt依赖库 考虑这个问题主要是&#xff1a;当我们的程序运行好之后&#…

【现代C++】范围库的应用

C20引入了范围库&#xff08;Ranges library&#xff09;&#xff0c;它是标准模板库&#xff08;STL&#xff09;的一个扩展&#xff0c;提供了一种新的方式来处理序列和范围。这个库允许开发者以更声明式的方式编写代码&#xff0c;使得操作序列变得更简洁、更易读。以下是C范…

HTML静态网页成品作业(HTML+CSS)——动漫喜羊羊网页设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

51 单片机[2-2]:LED闪烁

摘要&#xff1a; 本文使用STC89C52RC单片机实现单个LED闪烁 新建一个项目&#xff0c;具体步骤见[2-1] 分析&#xff1a; 要使 LED 闪烁&#xff08;以D1为例&#xff09;&#xff0c;就要先让 P2 0xfe; 再让 P2 0xff; 先在keil5中把程序写成这样&#xff1a; #include &…

代码随想录——在每个树行中找最大值(Leetcode515)

题目链接 层序遍历 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) …

风电功率预测 | 基于BP神经网络的风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测 | 基于BP神经网络的风电功率预测(附matlab完整源码)完整代码风电功率预测 | 基于BP神经网络的风电功率预测(附matlab完整源码) 基于BP神经网络的风电功率预测是一种常见的方法,它利用BP神经网络模型来预测风电场的发电功率。下面是一个基于BP神经…

SEO之为什么研究关键词(二)

初创企业需要建站的朋友看这篇文章&#xff0c;谢谢支持&#xff1a; 我给不会敲代码又想搭建网站的人建议 新手上云 &#xff08;续上一篇。。。。。&#xff09; 3、寻找有效流量 排名和流量都不是目的&#xff0c;有效流量带来的转化才是目的。就算公司有足够的实力将一些…

010.理解异步性

异步消息传递是响应式系统的一个关键特性。但到底是什么异步性&#xff0c;为什么它对响应式应用程序如此重要?我们的人生注定在许多异步任务中。你可能没有意识到&#xff0c;但你的日常活动如果它们本质上不是异步的&#xff0c;那就太烦人了。要理解什么是异步&#xff0c;…

Burp Suite Professional 2024.4 (macOS, Linux, Windows) - Web 应用安全、测试和扫描

Burp Suite Professional 2024.4 (macOS, Linux, Windows) - Web 应用安全、测试和扫描 Burp Suite Professional, Test, find, and exploit vulnerabilities. 请访问原文链接&#xff1a;Burp Suite Professional 2024.4 (macOS, Linux, Windows) - Web 应用安全、测试和扫描…

云动态摘要 2024-05-15

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]即刻畅享自研SaaS产品 腾讯云 2024-04-25 涵盖办公协同、营销拓客、上云安全保障、数据分析处理等多场景 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用…

一本书打通SLAM在智能汽车/自动驾驶领域应用

自动驾驶技术已成为当今数字化时代汽车行业的热点话题之一。随着技术的不断成熟&#xff0c;越来越多的车辆采用激光SLAM&#xff08;即时定位与地图构建&#xff09;和视觉SLAM技术&#xff0c;实现更高层次的智能网联汽车。SLAM技术在智能网联汽车中的应用是非常重要的&#…

【算法】NOIP2003神经网络

题目描述 人工神经网络&#xff08;Artificial Neural Network&#xff09;是一种新兴的具有自我学习能力的计算系统&#xff0c;在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是当今的热门方向&#xff0c;兰兰同学在自学了一本神经网络的…