数据结构篇(六):线性表——队列
前言上一篇讲了栈——后进先出的结构。这一篇讲队列和栈刚好相反队列是先进先出的结构。栈用数组实现是最优选择而队列则正好相反链表实现是更常用、更优的选择。本文将讲清楚队列的原理、为什么队列更适合用链表实现以及完整的代码实现。一、什么是队列队列Queue是一种只允许在一端插入数据在另一端删除数据的线性表。插入数据的一端叫队尾tail / rear这个操作叫入队push / enqueue删除数据的一端叫队头head / front这个操作叫出队pop / dequeue。队列的核心特性是先进先出FIFOFirst In First Out最先进队的元素最先出队。生活中的例子排队买奶茶先来的人先买到后来的人排在后面操作系统的任务调度队列消息队列。二、为什么队列更适合用链表实现这是队列和栈很大的不同点值得单独拎出来讲清楚。栈只在一端操作栈顶用数组实现时尾插尾删都是O(1)非常合适队列需要在两端操作队尾入队队头出队。如果用数组实现队头出队意味着所有元素都要往前搬移一位效率是O(N)非常低效除非用循环数组或者额外维护两个下标但实现相对复杂而用链表实现队列只要同时维护一个头指针和一个尾指针头删出队和尾插入队都能做到O(1)完美契合队列的操作特点。所以结论是栈优先用数组实现队列优先用链表实现。三、队列的结构定义队列通常用单链表实现即可因为只需要头删和尾插两种操作不需要双向链表的能力。为了让尾插也能达到O(1)否则每次尾插都要遍历找最后一个节点需要额外维护一个尾指针。typedef int QDataType; // 链表节点 typedef struct QueueNode { QDataType data; struct QueueNode* next; } QueueNode; // 队列结构维护头指针、尾指针和有效元素个数 typedef struct Queue { QueueNode* head; // 指向队头出队在这里操作 QueueNode* tail; // 指向队尾入队在这里操作 int size; // 有效元素个数 } Queue;四、队列的基本操作4.1 初始化void QueueInit(Queue* pq) { assert(pq ! NULL); pq-head NULL; pq-tail NULL; pq-size 0; }4.2 入队Push新节点始终插入到tail之后再更新tail。需要单独处理队列为空的情况此时head和tail都要指向新节点。void QueuePush(Queue* pq, QDataType x) { assert(pq ! NULL); QueueNode* newNode (QueueNode*)malloc(sizeof(QueueNode)); if (newNode NULL) { perror(malloc fail); exit(-1); } newNode-data x; newNode-next NULL; if (pq-tail NULL) { // 队列为空新节点既是队头也是队尾 pq-head newNode; pq-tail newNode; } else { pq-tail-next newNode; pq-tail newNode; } pq-size; }4.3 出队Pop出队从head开始删除。同样需要处理删除后队列变空的情况此时要把tail也置为NULL否则会成为野指针。void QueuePop(Queue* pq) { assert(pq ! NULL); assert(pq-head ! NULL); // 队列不能为空 QueueNode* next pq-head-next; free(pq-head); pq-head next; // 如果删除后队列为空tail也要置空 if (pq-head NULL) { pq-tail NULL; } pq-size--; }4.4 取队头 / 队尾元素QDataType QueueFront(Queue* pq) { assert(pq ! NULL); assert(pq-head ! NULL); return pq-head-data; } QDataType QueueBack(Queue* pq) { assert(pq ! NULL); assert(pq-tail ! NULL); return pq-tail-data; }4.5 判空bool QueueEmpty(Queue* pq) { assert(pq ! NULL); return pq-head NULL; }4.6 获取有效元素个数int QueueSize(Queue* pq) { assert(pq ! NULL); return pq-size; }4.7 销毁​void QueueDestroy(Queue* pq) { assert(pq ! NULL); QueueNode* cur pq-head; while (cur ! NULL) { QueueNode* next cur-next; free(cur); cur next; } pq-head pq-tail NULL; pq-size 0; }五、完整测试代码int main() { Queue q; QueueInit(q); QueuePush(q, 1); QueuePush(q, 2); QueuePush(q, 3); QueuePush(q, 4); printf(队头: %d, 队尾: %d\n, QueueFront(q), QueueBack(q)); // 队头: 1, 队尾: 4 while (!QueueEmpty(q)) { printf(%d , QueueFront(q)); QueuePop(q); } printf(\n); // 1 2 3 4和入队顺序一致 QueueDestroy(q); return 0; }六、时间复杂度分析操作时间复杂度说明入队 pushO(1)有tail指针无需遍历出队 popO(1)直接操作head取队头/队尾O(1)直接访问指针判空O(1)判断head是否为NULL可以看到只要正确维护了head和tail两个指针队列的所有标准操作都能做到O(1)这也印证了为什么链表是实现队列的最佳选择。七、队列的经典应用场景广度优先遍历BFS无论是树的层序遍历还是图的广度优先遍历都需要用队列来保存下一层待访问的节点这是队列最经典的应用任务调度 / 消息队列操作系统的进程调度、生产者-消费者模型、消息中间件如Kafka、RabbitMQ的核心思想都基于队列的先进先出特性保证任务按顺序被处理缓冲区例如打印机的打印队列、网络数据包的接收缓冲区都需要按到达顺序依次处理循环队列在数据量有明确上限、且频繁出入队的场景如环形缓冲区会使用数组实现的循环队列通过取模运算复用空间避免链表频繁申请释放节点的开销。八、队列 vs 栈 对比总结特性栈队列操作原则后进先出LIFO先进先出FIFO操作端一端栈顶两端队头出队尾进常用实现方式数组链表核心指针一个tophead tail 两个指针典型应用括号匹配、DFS、函数调用栈BFS、任务调度、消息队列九、总结队列的核心也只有一句话先进先出。相比栈用数组实现的简单直接队列因为需要同时在两端高效操作更适合用链表 头尾双指针的方式实现这样入队出队都能稳定做到O(1)。理解队列尤其是配合BFS的使用场景是后续学习树的层序遍历、图论算法的重要基础建议实现完之后动手写一道BFS的题目加深理解。如果这篇文章对你有帮助欢迎点赞收藏后续会继续更新树、二叉树等数据结构内容

相关新闻

多项式核回归原理与实战:解决非线性回归问题

多项式核回归原理与实战:解决非线性回归问题

1. 多项式核回归的本质与价值在真实世界的数据分析中,我们常常会遇到这样的场景:销售增长曲线呈现先加速后放缓的S型趋势,设备故障率随使用时长呈现三次函数变化,化学反应速率与温度构成非线性关系...这些都无法用简单的直线关系来…

2026/7/23 23:02:41 阅读更多 →
2026年会计毕业论文软件深度评测:学范文等五款工具横评,谁才是毕业利器?

2026年会计毕业论文软件深度评测:学范文等五款工具横评,谁才是毕业利器?

千万别等交了论文才发现自己踩坑——每年近63.7%的会计应届生因选题烂尾、查重超标被迫延期毕业(数据来源:中国教育在线2025毕业生调研)。我们耗时21天,实测了当前主流会计毕业论文软件,结论先行:学范文凭借…

2026/7/23 23:02:41 阅读更多 →
Oracle 19c 性能参数排查:ACS 未开启引发的执行计划突变案例分析

Oracle 19c 性能参数排查:ACS 未开启引发的执行计划突变案例分析

先说背景,实在没想通这个默认打开的参数为什么关闭了。从来没去考虑过会关闭。而且大部分都是打开的。实在不巧遇到这个数据库是关闭的一、问题背景前几天在客户现场排查一个性能问题,发现 Oracle 19c 数据库中 ACS(Adaptive Cursor Sharing&…

2026/7/23 23:02:41 阅读更多 →

最新新闻

AI会议纪要不是“转录完事”:2024最新Gartner评估报告显示,仅12%企业实现行动项自动追踪闭环

AI会议纪要不是“转录完事”:2024最新Gartner评估报告显示,仅12%企业实现行动项自动追踪闭环

更多请点击: https://kaifayun.com 第一章:AI会议纪要不是“转录完事”:从Gartner报告看智能纪要的本质跃迁 Gartner在2024年《Emerging Technologies for Digital Workplace》报告中明确指出:“智能会议纪要已跨越语音转文字&am…

2026/7/23 23:12:49 阅读更多 →
三星扩产2倍背后的半导体设备采购逻辑与技术选型框架

三星扩产2倍背后的半导体设备采购逻辑与技术选型框架

7月22日,三星电子正评估将美国泰勒厂的初期生产规模扩大至原计划的2倍。这一事件是半导体设备“超级周期”持续强化的又一信号。一、半导体设备高景气周期的多重确认三星泰勒厂扩产至2倍:美国最大半导体投资项目之一,已锁定客户订单台积电资本…

2026/7/23 23:12:49 阅读更多 →
经营 35-45 岁黄金十年:IT 人的破局之道与路径选择一、行业现状:35 岁现象的现实困境与机遇在数字化浪潮席卷全球的当下,IT 行业正经历着前所未有的变革。根据 CSDN 2024 年数据显

经营 35-45 岁黄金十年:IT 人的破局之道与路径选择一、行业现状:35 岁现象的现实困境与机遇在数字化浪潮席卷全球的当下,IT 行业正经历着前所未有的变革。根据 CSDN 2024 年数据显

经营 35-45 岁黄金十年:IT 人的破局之道与路径选择一、行业现状:35 岁现象的现实困境与机遇在数字化浪潮席卷全球的当下,IT 行业正经历着前所未有的变革。根据 CSDN 2024 年数据显示,国内 35 岁以上程序员占比仅 9.4%,…

2026/7/23 23:12:49 阅读更多 →
下一代企业智能基座:为什么说「LLM 规划 + MCP 调度 + Agent 执行」= 未来标配?一、引言:从工具到系统的智能化跃迁在企业数字化转型的深水区,传统 IT 架构正面临决策滞后、资源割

下一代企业智能基座:为什么说「LLM 规划 + MCP 调度 + Agent 执行」= 未来标配?一、引言:从工具到系统的智能化跃迁在企业数字化转型的深水区,传统 IT 架构正面临决策滞后、资源割

下一代企业智能基座:为什么说「LLM 规划 MCP 调度 Agent 执行」 未来标配?一、引言:从工具到系统的智能化跃迁在企业数字化转型的深水区,传统 IT 架构正面临决策滞后、资源割裂、执行僵化三大核心痛点。例如,某制造业…

2026/7/23 23:12:49 阅读更多 →
AI会说安慰的话,就等于有情商吗?

AI会说安慰的话,就等于有情商吗?

一句“我理解你”正在变得廉价,真正的情感智能必须经得起误判、沉默与长期关系 今天几乎所有聊天机器人都会说:“听起来你经历了很多”“我能理解你的感受”“你愿意多说一点吗?”这些句子柔和、礼貌,也符合人们对共情的想象。问…

2026/7/23 23:12:49 阅读更多 →
Kimi K3 发布当天,我拿它和 GPT-5.6-Luna、Claude Sonnet 5 跑了 5 轮硬核编程题——有一类多步推理任务排名和官方宣传完全反过来

Kimi K3 发布当天,我拿它和 GPT-5.6-Luna、Claude Sonnet 5 跑了 5 轮硬核编程题——有一类多步推理任务排名和官方宣传完全反过来

上周三 Kimi K3 发布,朋友圈被刷屏了。Moonshot 官方宣传说"推理能力大幅跃升",我当天晚上就把 moonshotai/kimi-k3、openai/gpt-5.6-luna、anthropic/claude-sonnet-5 三个模型拉到同一套测试框架里跑了一遍。结论先放这儿:在单步…

2026/7/23 23:11:44 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻