数据结构-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、与部…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...
