数据结构-3.6.队列的链式实现
队列可以理解为单链表的阉割版,相比单链表而言,队列只有在添加和删除元素上和单链表有区别

一.队列的链式实现:
1.图解:

2.代码:
#include<stdio.h>
typedef struct LinkNode //链式队列结点
{int data;struct LinkNode *next;
}LinkNode;
typedef struct //链式队列
{LinkNode *front; //队头指针LinkNode *rear; //队尾指针
}LinkQueue;
int main()
{return 0;
}
二.初始化队列:
1.带头结点:
a.图解:

b.代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode //链式队列结点
{int data;struct LinkNode *next;
}LinkNode;
typedef struct //链式队列
{LinkNode *front; //队头指针LinkNode *rear; //队尾指针
}LinkQueue;
//初始化队列(带头结点)
void InitQueue(LinkQueue &Q)
{//初始化时,front和rear都指向头结点Q.front = Q.rear = (LinkNode *)malloc(sizeof(LinkNode));//malloc用于申请一个头结点 Q.front -> next=NULL; //头指针下一个元素为NULL,因为一开始什么都没有
}
//判断队列是否为空
bool IsEmpty(LinkQueue Q)
{if( Q.front==Q.rear ) //也可以这么判断:如果Q.front -> next==NULL,此时队列为空 {return true; //代表队列为空 }else{return false; //代表队列不为空 }
}
int main()
{LinkQueue Q;//声明一个队列InitQueue(Q); //初始化队列//后续操作。。。 return 0;
}
2.不带头结点:
a.图解:

b.代码:
#include<stdio.h>
typedef struct LinkNode //链式队列结点
{int data;struct LinkNode *next;
}LinkNode;
typedef struct //链式队列
{LinkNode *front; //队头指针LinkNode *rear; //队尾指针
}LinkQueue;
//初始化队列(不带头结点)
void InitQueue(LinkQueue &Q)
{//初始化时,front和rear都指向NULLQ.front=NULL;Q.rear=NULL;
}
//判断队列是否为空
bool IsEmpty(LinkQueue Q)
{if( Q.front==NULL ) //只需要看头指针是否等于NULL即可,也可以看Q.rear是否为NULL,是的话队列为空 {return true; //代表队列为空,头指针为NULL,代表没有头指针,自然队列为空 }else{return false; //代表队列不为空 }
}
int main()
{LinkQueue Q;//声明一个队列InitQueue(Q); //初始化队列//后续操作。。。return 0;
}
三.入队操作:
1.带头结点:
a.图解:

b.代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode //链式队列结点
{int data;struct LinkNode *next;
}LinkNode;
typedef struct //链式队列
{LinkNode *front; //队头指针LinkNode *rear; //队尾指针
}LinkQueue;
//初始化队列(带头结点)
void InitQueue(LinkQueue &Q)
{//初始化时,front和rear都指向头结点Q.front = Q.rear = (LinkNode *)malloc(sizeof(LinkNode));//malloc用于申请一个头结点 Q.front -> next=NULL; //头指针下一个元素为NULL,因为一开始什么都没有
}
//判断队列是否为空
bool IsEmpty(LinkQueue Q)
{if( Q.front==Q.rear ) //也可以这么判断:如果Q.front -> next==NULL,此时队列为空 {return true; //代表队列为空 }else{return false; //代表队列不为空 }
}
//新元素入队(带头结点)
void EnQueue(LinkQueue &Q,int x)//只是让x入队,不改变x的值,所以无需&
{LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode)); //用malloc申请一个新结点用来存要入队的元素 s->data = x; //把新插入的元素x放入新结点中 s->next = NULL; //由于队列入队的操作是在表尾的位置进行,因此新插入的结点是队列的最后一个结点,后面就是NULL Q.rear->next = s;/*由于一开始rear指针指向的是当前的表尾结点,而新插入的新结点应该连到表尾结点之后,所以要把rear指向的结点next指针域指向新结点s */Q.rear = s; //修改表尾指针指向新添加的元素,新添加的元素就是表尾元素
}
int main()
{LinkQueue Q;//声明一个队列InitQueue(Q); //初始化队列//后续操作。。。 return 0;
}
2.不带头结点:
a.图解:

b.代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode //链式队列结点
{int data;struct LinkNode *next;
}LinkNode;
typedef struct //链式队列
{LinkNode *front; //队头指针LinkNode *rear; //队尾指针
}LinkQueue;
//初始化队列(不带头结点)
void InitQueue(LinkQueue &Q)
{//初始化时,front和rear都指向NULLQ.front=NULL;Q.rear=NULL;
}
//判断队列是否为空
bool IsEmpty(LinkQueue Q)
{if( Q.front==NULL ) //只需要看头指针是否等于NULL即可,也可以看Q.rear是否为NULL,是的话队列为空 {return true; //代表队列为空,头指针为NULL,代表没有头指针,自然队列为空 }else{return false; //代表队列不为空 }
}
//新元素入队(不带头结点)
void EnQueue(LinkQueue &Q,int x)
{LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));//用malloc申请一个新结点用来存要入队的元素 s->data = x;//把新插入的元素x放入新结点中s->next = NULL;//由于队列入队的操作是在表尾的位置进行,因此新插入的结点是队列的最后一个结点,后面就是NULL if( Q.front==NULL ) //在空队列中插入第一个元素,插入第一个元素时Q.front为NULL,因为刚开始front和rear都指向NULL { //如果队列为空,那么插入的元素就是队列第一个元素 //修改队头和队尾指针 Q.front = s;Q.rear = s;}else{Q.rear->next = s;//新结点插入到rear结点之后 Q.rear = s;//修改rear指针 }
}
int main()
{LinkQueue Q;//声明一个队列InitQueue(Q); //初始化队列//后续操作。。。return 0;
}
四.出队操作:
1.带头结点:
a.图解:
不是最后一个元素出队:


最后一个元素出队:



b.代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode //链式队列结点
{int data;struct LinkNode *next;
}LinkNode;
typedef struct //链式队列
{LinkNode *front; //队头指针LinkNode *rear; //队尾指针
}LinkQueue;
//初始化队列(带头结点)
void InitQueue(LinkQueue &Q)
{//初始化时,front和rear都指向头结点Q.front = Q.rear = (LinkNode *)malloc(sizeof(LinkNode));//malloc用于申请一个头结点 Q.front -> next=NULL; //头指针下一个元素为NULL,因为一开始什么都没有
}
//判断队列是否为空
bool IsEmpty(LinkQueue Q)
{if( Q.front==Q.rear ) //也可以这么判断:如果Q.front -> next==NULL,此时队列为空 {return true; //代表队列为空 }else{return false; //代表队列不为空 }
}
//队头元素出队(带头结点)
bool DeQueue(LinkQueue &Q,int &x) //最终x会变为要删除的元素,所以需要&
{if( Q.front==Q.rear ){return false;//空队,就无法出队即删除元素 }//此时队列不为空//Q.front为头结点 LinkNode *p = Q.front->next; //让p指针指向要删除的结点,对于带头结点的队列来说就是要删除头结点的后一个结点 x = p->data; //用变量x返回队头元素即要删除的元素 Q.front->next = p->next; //修改头结点的next指针if( Q.rear==p ) //此次是最后一个结点出队,最终就是空队列即Q.rear=Q.front {Q.rear=Q.front; //修改rear指针 } free(p); //释放结点空间return true;
}
int main()
{LinkQueue Q;//声明一个队列InitQueue(Q); //初始化队列//后续操作。。。 return 0;
}
2.不带头结点:
a.图解:



b.代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode //链式队列结点
{int data;struct LinkNode *next;
}LinkNode;
typedef struct //链式队列
{LinkNode *front; //队头指针LinkNode *rear; //队尾指针
}LinkQueue;
//初始化队列(不带头结点)
void InitQueue(LinkQueue &Q)
{//初始化时,front和rear都指向NULLQ.front=NULL;Q.rear=NULL;
}
//判断队列是否为空
bool IsEmpty(LinkQueue Q)
{if( Q.front==NULL ) //只需要看头指针是否等于NULL即可,也可以看Q.rear是否为NULL,是的话队列为空 {return true; //代表队列为空,头指针为NULL,代表没有头指针,自然队列为空 }else{return false; //代表队列不为空 }
}
//队头元素出队(不带头结点)
bool DeQueue(LinkQueue &Q,int &x)
{if( Q.front==NULL ){return false; //空队 }LinkNode *p=Q.front; //p指向此次出队的结点即front指针指向的结点出队 x = p->data; //用变量x返回队头元素 Q.front = p->next; //由于没有头结点,所以每次有队头元素出队后都需要修改front指针的指向 if( Q.rear==p ) //此次是最后一个结点出队,最终就是空队列 {Q.front=NULL; //front指向NULL Q.rear=NULL; //rear指向NULL } free(p); //释放结点空间 return true;
}
int main()
{LinkQueue Q;//声明一个队列InitQueue(Q); //初始化队列//后续操作。。。return 0;
}
五.队列满的条件:

六.统计队列的长度:
思路:
从队头结点开始依次往后遍历,统计总共有多少个结点,显然时间复杂度为O(n)。
七.总结:

相关文章:
数据结构-3.6.队列的链式实现
队列可以理解为单链表的阉割版,相比单链表而言,队列只有在添加和删除元素上和单链表有区别 一.队列的链式实现: 1.图解: 2.代码: #include<stdio.h> typedef struct LinkNode //链式队列结点 {int data;st…...
Java中去除字符串中的空格
在平时的开发中,在后端经常要获取前端传过来的字符串,有的是用户从输入框中输入的,有的是通过excel表格中获取的。 在这些字符串中,有时候会遇到字符串中有空格、换行符或者制表符,对于这种字符串来说,直接…...
AI大模型算法工程师就业宝典—— 高薪入职攻略与转行秘籍!
从ChatGPT到新近的GPT-4,GPT模型的发展表明,AI正在向着“类⼈化”⽅向迅速发展。 GPT-4具备深度阅读和识图能⼒,能够出⾊地通过专业考试并完成复杂指令,向⼈类引以为傲的“创造⼒”发起挑战。 现有的就业结构即将发⽣重⼤变化&a…...
node-rtsp-stream、jsmpeg.min.js实现rtsp视频在web端播放
1. 服务地址(私有):https://gitee.com/nnlss/video-node-server 2.node-rtsp-stream 需要安装FFMPEG; 3.给推拉流做了开关,可借助http请求,有更好方式可联系; 4.存在问题: 1&…...
C++ 9.27
作业: 将之前实现的顺序表、栈、队列都更改成模板类 Stack #include <iostream> using namespace std; template <typename T> class Stack { private: T* arr; // 存储栈元素的数组 int top; // 栈顶索引 int capacity; // 栈的…...
让具身智能更快更强!华东师大上大提出TinyVLA:高效视觉-语言-动作模型,遥遥领先
论文链接:https://arxiv.org/pdf/2409.12514 项目链接:https://tiny-vla.github.io/ 具身智能近期发展迅速,拥有了大模型"大脑"的机械臂在动作上更加高效和精确,但现有的一个难点是:模型受到算力和数据的制…...
Excel 获取某列不为空的值【INDEX函数 | SMALL函数或 LARGE函数 | ROW函数 | ISBLANK 函数】
〇、需求 Excel 获取某列不为空的值(获取某列中第一个非空值 或 获取某列中最后一个非空值)。 一、知识点讲解 INDEX函数 和 SMALL函数 两个函数搭配使用都可以实现上述需求 获取某列中第一个非空值 。 INDEX函数 和 LARGE函数 两个函数搭配使用都可以实现上述需求 获取某…...
爆火!大模型算法岗 100 道面试题全解析,赶紧收藏!
大模型应该是目前当之无愧的最有影响力的AI技术,它正在革新各个行业,包括自然语言处理、机器翻译、内容创作和客户服务等等,正在成为未来商业环境的重要组成部分。 截至目前大模型已经超过200个,在大模型纵横的时代,不…...
Python画笔案例-068 绘制漂亮米
1、绘制漂亮米 通过 python 的turtle 库绘制 漂亮米,如下图: 2、实现代码 绘制 漂亮米,以下为实现代码: """漂亮米.py注意亮度为0.5的时候最鲜艳本程序需要coloradd模块支持,安装方法:pip install coloradd程序运行需要很长时间,请耐心等待。可以把窗口最小…...
得物App荣获国家级奖项,正品保障引领潮流电商新风尚
近日,在2024年中国国际服务贸易交易会上,得物App凭借其在科技创新保障品质消费领域的突出成果,再次荣获国家级殊荣——“科技创新服务示范案例”。这是继上海市质量金奖之后,得物App获得的又一个“高含金量”奖项。 作为深受年轻人…...
【BurpSuite】SQL注入 | SQL injection(1-2)
🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍收藏💗支持一下哦 【BurpSuite】SQL注入 | SQL injection(1-2) 实验一 Lab: SQL injection vulnerability in WHERE clause…...
ThreadPoolExecutor有哪些核心的配置参数?
ThreadPoolExecutor 是 Java 中强大的线程池实现,具有多种配置参数,可以灵活地根据具体应用需求进行调整。以下是 ThreadPoolExecutor 的核心配置参数及其简要说明: 1. corePoolSize 描述:核心线程池的大小,即最小保…...
关于工作虚拟组的一些思考
这是学习笔记的第 2493篇文章 因为各种工作协作,势必要打破组织边界,可能会存在各种形态的虚拟组。 近期沉淀了一些虚拟组的管理方式,在一定时间范围内也有了一些起色,所以在不断沉淀的过程中,也在不断思考。 这三个虚…...
【Redis入门到精通六】在Spring Boot中集成Redis(含配置和操作演示)
目录 Spring Boot中集成Redis 1.项目创建和环境配置 2.基本操作演示 Spring Boot中集成Redis Spring社区也自定义了一套Redis的客户端,与jedis的操作方式有所差异,Spring中把每个类型的操作都单独封装了起来。下面就让我来带大家了解如何在Spring Boot…...
【CSS】透明度 、过渡 、动画 、渐变
opacity 透明度transition 过渡animation 动画background 渐变 ( 线性渐变 \ 径向渐变 \ 锥形渐变 ) opacity 透明度 设置元素的透明度,会影响元素及其所有子元素的透明度,值范围:0(完全透明)到 1(完全不透…...
尚硅谷vue3+TypeScript笔记大全
1. Vue3简介 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece(n 经历了:4800次提交、40个RFC、600次PR、300贡献者 官方发版地址:Release v3.0.0 One Piece vuejs/core 截止2023年10月,最…...
New major version of npm available! 8.3.1 -> 10.8.3 报错
问题 npm install 安装新项目时,出现如下升级错误。 npm notice npm notice New major version of npm available! 8.3.1 -> 10.8.3 npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.8.3 npm notice Run npm install -g npm10.8.3 to upd…...
Python(七)- 文件操作
目录 文件操作 打开文件 读数据 写数据 关闭文件 文件读写实例 文件写 文件读 读数据类型 备份文件 os模块 目录的具体操作 文件操作 在Python中操作文件记录信息的步骤: (1)打开文件,或新建一个文件; o…...
Docker技术深度解析与实践案例
Docker技术深度解析与实践案例 在当今快速迭代的软件开发环境中,如何高效地打包、部署和管理应用成为了开发人员和运维团队面临的重大挑战。Docker,作为一种开源的应用容器引擎,凭借其轻量级、可移植性和高效性,迅速成为解决这些…...
llama_deploy
本文于 240924 翻译整理自: https://docs.llamaindex.ai/en/stable/module_guides/workflow/deployment/ 文章目录 一、关于 🦙`llama_deploy`🤖为什么使用 `llama_deploy`?等等,`llama-agents` 在哪里?二、入门1、安装2、高级部署3、部署核心系统4、部署工作流5、与部…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...
算法250609 高精度
加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...
