Days 22栈与队列

发布时间:2026/10/9 9:20:41

Days 22栈与队列 一、前言程序 数据结构 算法栈和队列是开发中最基础、高频使用的受限线性表。 数组 / 普通链表可以在任意位置增删元素而栈、队列严格限制操作位置栈后进先出 LIFO仅栈顶插入、删除队列先进先出 FIFO队尾入队、队头出队本文基于 LinuxC 语言实现包含顺序栈、链式栈、循环队列、链式队列全套代码配套内存图解、易错点分析适合期末复习、面试基础复习。二、栈Stack核心理论2.1 栈核心规则操作端只有栈顶栈底固定入栈 (Push)数据放到栈顶出栈 (Pop)只取出栈顶元素判空无有效元素判满仅顺序栈存在数组空间用完两种实现顺序栈连续数组、链栈动态节点无容量上限2.2 顺序栈数组实现1. 结构体设计c运行typedef int DataType; typedef struct{ DataType *pData; // 动态数组存放栈数据 int tLen; // 栈最大容量 int Top; // 栈针指向下一个待写入位置Top0代表空栈 }Stack_t;内存图解pData是堆区连续内存Top 记录当前栈元素个数空栈Top 0满栈Top tLen2. 完整 seqstack.h 头文件c运行#ifndef __SEQSTACK_H__ #define __SEQSTACK_H__ typedef int DataType; typedef struct{ DataType *pData; int tLen; int Top; }Stack_t; // 创建栈指定最大容量 extern Stack_t *CreateSeqStack(int Len); // 判断栈空 extern int IsEmptySeqStack(Stack_t *pTmpStack); // 判断栈满 extern int IsFullSeqStack(Stack_t *pTmpStack); // 入栈 extern int PushSeqStack(Stack_t *pTmpStack, DataType TmpData); // 出栈返回栈顶值 extern DataType PopSeqStack(Stack_t *pTmpStack); // 销毁栈二级指针避免野指针 extern int DestroySeqStack(Stack_t **ppTmpStack); #endif3. seqstack.c 功能实现c运行#include seqstack.h #include stdio.h #include stdlib.h // 创建顺序栈 Stack_t *CreateSeqStack(int Len) { Stack_t *pTmpStack (Stack_t *)malloc(sizeof(Stack_t)); if (NULL pTmpStack) { perror(栈结构体申请失败); return NULL; } pTmpStack-tLen Len; pTmpStack-Top 0; pTmpStack-pData (DataType *)malloc(sizeof(DataType) * Len); if (NULL pTmpStack-pData) { perror(数组空间申请失败); free(pTmpStack); return NULL; } return pTmpStack; } // 判断栈空 int IsEmptySeqStack(Stack_t *pTmpStack) { return pTmpStack-Top 0; } // 判断栈满 int IsFullSeqStack(Stack_t *pTmpStack) { return pTmpStack-Top pTmpStack-tLen; } // 入栈 int PushSeqStack(Stack_t *pTmpStack, DataType TmpData) { if (IsFullSeqStack(pTmpStack)) { printf(栈已满无法入栈\n); return -1; } pTmpStack-pData[pTmpStack-Top] TmpData; pTmpStack-Top; return 0; } // 出栈先存数据再释放/移动栈针禁止free后取值 DataType PopSeqStack(Stack_t *pTmpStack) { if (IsEmptySeqStack(pTmpStack)) { printf(栈为空无法出栈\n); return 0; } pTmpStack-Top--; return pTmpStack-pData[pTmpStack-Top]; } // 销毁栈 int DestroySeqStack(Stack_t **ppTmpStack) { if (NULL ppTmpStack || NULL *ppTmpStack) return -1; free((*ppTmpStack)-pData); free(*ppTmpStack); *ppTmpStack NULL; return 0; }4. main.c 测试代码c运行#include seqstack.h #include stdio.h int main(void) { Stack_t *pseq CreateSeqStack(10); // 入栈1~5 for(int i1;i5;i) PushSeqStack(pseq, i); // 出栈打印后进先出 5 4 3 2 1 while(!IsEmptySeqStack(pseq)) printf(%d , PopSeqStack(pseq)); DestroySeqStack(pseq); return 0; }5. 顺序栈优缺点✅ 优点随机访问栈顶、内存连续、读写速度快 ❌ 缺点容量固定扩容麻烦空间不足会栈满闲置数组会内存浪费。2.3 链式栈链表实现无容量限制1. 节点结构带哨兵头节点c运行typedef int DataType; typedef struct Node{ DataType data; struct Node *pNext; }Node_t;设计思路头插法头节点pNext直接指向栈顶入栈出栈仅操作头节点后第一个节点时间复杂度 O (1)。空栈pHead-pNext NULL无需判满堆内存足够可无限入栈2. 链栈核心实现关键易错点出栈逻辑必须遵循保存栈顶节点指针提前取出节点 data断开头节点与栈顶连接free 释放节点禁止先 free 再读取 data释放后内存失效程序段错误完整链栈 Push/Pop 示例c运行// 入栈 int PushLinkStack(Node_t *pHead, DataType val) { Node_t *pNew (Node_t*)malloc(sizeof(Node_t)); if(!pNew) return -1; pNew-data val; pNew-pNext pHead-pNext; pHead-pNext pNew; return 0; } // 出栈 DataType PopLinkStack(Node_t *pHead) { if(pHead-pNext NULL) { printf(链栈空\n); return 0; } Node_t *pDel pHead-pNext; DataType res pDel-data; // 先存数据 pHead-pNext pDel-pNext; free(pDel); return res; }链栈优缺点✅ 无容量上限、按需分配内存无空间浪费 ❌ 每个节点附带指针额外消耗内存无法随机访问。三、队列Queue核心理论3.1 队列规则先进先出 FIFO只能队尾插入入队 Enter、队头删除出队 Quit 两种实现循环顺序队列解决普通顺序队列假溢出、链式队列3.2 循环顺序队列普通数组队列会出现假溢出队头元素出队后前面空间闲置但无法入队循环队列通过取模(rear1)%maxlen实现环形复用。 判空front rear判满(rear1)%maxlen front牺牲一格空间区分空 / 满3.3 链式队列双指针设计头指针 front出队、尾指针 rear入队入队操作尾指针出队操作头指针无假溢出、无容量限制。四、栈和队列对比总结表格特性顺序栈链栈循环队列链队列存储连续数组离散链表节点环形数组离散链表容量固定上限无上限固定上限无上限操作复杂度O(1)O(1)O(1)O(1)内存开销仅数据数据 指针仅数据数据 指针溢出问题栈满溢出无溢出牺牲一格判满无溢出适用场景数据量固定数据动态增减固定批量任务持续大量任务五、高频面试 / 期末易错点顺序栈出栈不能 free 后取值必须先保存 data链栈统一头插法栈顶是头节点后继循环队列判满条件(rear1)%len front不可直接rearfront销毁容器使用二级指针将外部指针置 NULL杜绝野指针栈函数调用栈、表达式求值、括号匹配队列消息队列、任务调度、广度优先搜索 (BFS)。六、Linux 编译运行命令以顺序栈为例bash# 编译 gcc main.c seqstack.c -o stack -g # 运行 ./stack # gdb调试段错误 gdb ./stack # valgrind检测内存泄露 valgrind --toolmemcheck ./stack七、结尾栈和队列是二叉树、图、排序算法的基础容器建议手动完整敲一遍两套栈 两套队列代码吃透内存分配、指针操作、边界判空判满逻辑后续学习复杂数据结构会事半功倍。
延伸阅读

更多相关文章

2026/10/9 9:20:17

Havenlon 执行控制工程 02|密码学能冻结数据,但冻结不了现实

在很多系统的代码里,都能找到这样一段逻辑:验证签名,通过则接受,接受则执行。这条链短、清晰、易于测试,几乎是现代安全工程的默认写法。它成立的前提是一个很少被写进注释里的假设——只要真正的私钥持有者签署了这条…

2026/10/6 19:06:25

iOS灵动岛开发实战:ActivityKit与SwiftUI实现实时活动

1. 项目概述:从“刘海”到“灵动岛”的设计哲学演进当iPhone 14 Pro系列带着那块“药丸”形状的挖孔屏亮相时,几乎所有人都以为这不过是又一个为了屏占比而做的硬件妥协。但苹果用“灵动岛”(Dynamic Island)这个名字,…

2026/10/6 19:09:18

OpenClaw开源AI工具集:统一模型接入与技能编排实战

1. OpenClaw项目概述OpenClaw是一个新兴的开源AI工具集,近期在开发者社区中获得了广泛关注。作为一个整合了多种AI模型接口的中间件平台,它能够帮助开发者快速构建基于大语言模型的应用程序。我最初接触OpenClaw是在一个AI项目开发中,当时需要…

2026/10/9 9:20:33

从URL编码到HTTPS证书链:网络通信安全层层递进

移动端日志里经常能看到这么一串东西:urlhttps%3a%2f%2fdev.coc.1008...,后面跟着一堆%加十六进制数字。不懂的人把它当乱码,懂的人知道这是一段被编码过的 URL。而这串字符背后,其实是整个网络通信安全体系的第一道入口。这篇文章…

2026/10/9 9:20:33

MacBook到底要不要关机?睡眠与关机的正确使用姿势

MacBook要不要关机、多久关一次机比较好?这个问题我几乎每隔几天就能在社区里看到一次,问的人从刚入坑的学生到用了五六年的老用户都有。有趣的是,答案永远两极分化:一边说"合盖就走,从不管关机"&#xff0c…

2026/10/9 9:20:33

华为路由与交换技术答案解析:VLAN、STP与OSPF避坑指南

简介:这份Word文档对应华为网院教材《路由与交换技术》(刘丹宁、田果、韩世良著)的课后练习题答案及解释,目标读者是正在备考华为数通方向或学习路由交换基础的技术人员。文档按章节编排,逐题给出选择与判断题的正确答…

2026/10/9 9:20:33

大数据技术如何重塑家具定制:从需求画像到生产协同

家具定制这行,我这两年最大的体会是:真正难做的从来不是设计,而是把用户脑子里的想法变成车间里能生产的东西。我印象很深的一个订单,客户在其他平台看中一款嵌入式电视柜,兴冲冲发来户型图,结果设计师按图…

2026/10/9 9:20:33

视觉Transformer ViT原理与实战:从结构拆解到小样本分类

最近翻看各大模型榜单,一个很明显的趋势是:几乎所有新发布的视觉模型,骨架都换成了ViT。从CLIP到DINOv2,从SAM到各种多模态大模型,背后的视觉编码器清一色是Transformer结构。这篇科普想把这件事讲透:为什么…

2026/10/9 9:15:25

温湿度记录仪怎么选?五大品牌对比与场景化选型指南

1. 选温湿度记录仪,先搞懂这五个技术维度温湿度记录仪这东西看着不起眼,一个小盒子加个探头,似乎谁都会做,但真正到了医药冷库验证、疫苗冷链运输、精密实验室环境监测的场景里,你会瞬间发现便宜货和靠谱货之间隔着一道…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 0:04:27

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略

毕业论文初稿完成后首次进行AIGC疑似度自查的摸底与分流策略当数万字的学位论文初稿经历开题、实验、问卷与多轮文献梳理最终成形时,绝大多数研究生都会面临一道全新的形式审查关卡:AIGC 疑似度排查。在高校毕业审核流程中,盲审前的文本检测通…

2026/10/9 0:04:27

食堂节能改造源头工厂,商用厨房设备焕新方案广受好评

商用厨房作为餐饮经营、单位供餐的核心后勤阵地,其设备配置、动线规划与运维体系直接决定后厨作业效率、运营成本与合规性。从基础的灶具、制冷存储设备,到油烟净化、水处理等配套系统,每一个环节的合理性都与食品安全、能耗管控、消防安全挂…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑