一篇文章带你了解——栈和队列
目录栈1、栈的基本概念2、栈的实现方式——数组存储结构初始化销毁入栈取出栈顶元素获取栈顶元素判空获取栈的长度3、实现方式——链表存储结构初始化销毁入栈出栈获取栈顶元素获取栈中有效元素个数判空队列基本概念队列的存储结构初始化销毁判空队列长获取头的元素入队列出队列栈1、栈的基本概念栈栈(stack)是限定仅在⼀端进⾏插⼊或删除操作的线性表。栈顶top能插入和删除的一端栈顶(bottom)不能插入和删除的一端出栈删除数据在栈顶入栈放入数据在栈顶——也叫压栈/入栈/进栈空栈没用任何元素栈也被称为后进先出的顺序表Last In First Out简称LIFO结构2、栈的实现方式——数组使用结构选择数组因为栈是“尾部操作”最频繁的数据结构后进先出而数组在尾部操作入栈/出栈的时间复杂度是 O(1)且内存连续、缓存利用率极高所以用数组是最自然、最高效的选择。基本操作void STInit(ST* st);//初始化void STDestroy(ST* st);//销毁void STPush(ST* st,STDataType x);//入栈void STPop(ST* st);//出栈STDataType STTop(ST* st);//获取栈顶元素bool STEmpty(ST* st);//判空int STSize(ST* st);//取长度存储结构typedef int STDataType; typedef struct Stack { STDataType* a;//存储数组 int top;//栈顶的下一位 int capacity;//容量 }ST;注意这里的top到底是指向栈顶元素还是栈顶的下一位如果指向栈顶元素那么top的初始化就要是-1如果是栈顶元素的下一位就是0。因为这里要思考一个问题 就是当top0的时候数组是否有元素如果top0的时候没用那么我们就要让top指向栈顶元素的下一位。下面的top指向的是栈顶元素的下一位。初始化void STInit(ST* st) { assert(st); st-a NULL; st-top 0; st-capacity 0; }销毁void STDestroy(ST* st) { assert(st); free(st-a); st-a NULL; st-capacity 0; st-top 0; }入栈void STPush(ST* st, STDataType x) { assert(st); if (st-top st-capacity) { int newcapacity st-capacity 0 ? 4 : st-capacity * 2; STDataType* tmp (STDataType*)realloc(st-a, newcapacity*sizeof(STDataType)); if (tmpNULL) { perror(realloc fail); return; } st-atmp; st-capacity newcapacity; } st-a[st-top] x; st-top; }取出栈顶元素void STPop(ST* st) { assert(st); assert(st-top0); st-top--; }获取栈顶元素STDataType STTop(ST* st) { assert(st); assert(st-top 0); return st-a[st-top-1]; }判空bool STEmpty(ST* st) { assert(st); return st-top 0; }获取栈的长度int STSize(ST* st) { assert(st); return st-top; }3、实现方式——链表链式栈的结构可以选择单链表也可以选择双向链表但是需要知道的是如果选择单链表要用头当作栈顶因为栈的特点就是在栈顶取数据和出数据单链表在头节点取出和放入数据的时间复杂度都是O1尾节点还要遍历找尾时间复杂度是O(N)。当然也可以使用双向链表而且无论是用头还是尾做栈顶时间复杂度都是O1但是建议还是选择单链表因为单链表相比双向链表节省空间因此使用单链表。在使用单链表的时候可以不使用哨兵位头结点也可用这里我不用因为哨兵位头结点并没有给头删和头插带来遍历所以不用也可以节省一个节点的空间。存储结构typedef int LSDataType; typedef struct LinkStackNode { struct LinkStackNode* Next; LSDataType data; }LSNode; typedef struct { LSNode* phead; int size; }LinkStack;这里定义了两个结构体对应了链表的节点和栈的管理结构他们的作用是不一样的可以把他们看作一个火车的车厢和火车头其中LinkStack是用来控制链表的起点和长度LSNode就是车厢的行李他们就构成了一个栈。初始化// 初始化链式栈s void LinkStackInit(LinkStack* s) { assert(s); s-phead NULL; s-size 0; }初始化的对象是LinkStack而不是LSNode因为要先有火车头LSNode等到入栈的时候才初始化因为入栈才开始创造节点。销毁// 销毁链式栈s void LinkStackDestroy(LinkStack* s) { assert(s); LSNode* cur s-phead; while (cur) { LSNode* nextNode cur-Next; free(cur); cur nextNode; } s-phead NULL; s-size 0; }入栈void LinkStackPush(LinkStack* s, LSDataType x) { assert(s); LSNode* newNode (LSNode*)malloc(sizeof(LSNode));//这里就要开始利用LSNode if (newNode NULL) { perror(malloc fail); return; } newNode-data x; newNode-Next s-phead; s-phead newNode; s-size; }出栈// 出栈并返回栈顶元素 LSDataType LinkStackPop(LinkStack* s) { assert(s); assert(s-size0); LSDataType ret s-phead-data; LSNode* nextNode s-phead-Next; free(s-phead); s-phead nextNode; s-size--; return ret; }获取栈顶元素// 获取栈顶元素 LSDataType LinkStackTop(LinkStack* s) { assert(s); assert(s-size 0); return s-phead-data; }获取栈中有效元素个数int LinkStackSize(LinkStack* s) { assert(s); return s-size; }判空bool LinkStackEmpty(LinkStack* s) { assert(s); return s-size 0; }队列基本概念队列只允许在一端进行插入数据操作在另一端进行删除数据操作的特殊线性表队列具有先进先出 FIFO(First In First Out)入队列进行插入操作的一端称为队尾出队列进行删除操作的一端称为队头队列的存储结构队列的链式存储我们可以选⽤单链表结构也可以选⽤双向链表结构。他们⼊队对应着在表尾插 ⼊出队对应着在表头删除。当然我们完全没必要选择双向链表因为单链表就可以⾼效实现还 省空间⼀些。双向链表没有优势每个结点还要多存储⼀个前驱指针使⽤它纯粹浪费了。typedef int QDataType; typedef struct QueueLinkNode { QDataType data; struct QueueLinkNode* Next; }QNode; typedef struct { QNode* Phead; QNode* Ptail; int size; }LinkQueue;//和上面所说是车厢不过要多一个Ptail方便尾插这里和上面的链式的栈实现类似定义两个结构体一个是节点的结构一个是栈的管理结构因为队列还要考虑队尾插入队尾插入记录的时候方便直接找到最后一个。初始化void QueueInit(LinkQueue* q) { assert(q); q-Phead q-Ptail (QNode*)malloc(sizeof(QNode)); if (q-Phead NULL) { perror(malloc fail); return; } q-Phead-Next NULL; q-size 0; }这里选择带头结点的链表。销毁void QueueDestroy(LinkQueue* q) { assert(q); QNode* cur q-Phead; while (cur) { QNode* nextNode cur-Next; free(cur); cur nextNode; } q-Phead NULL; q-Ptail NULL;//都要置为NULL q-size 0; }判空bool QueueEmpty(LinkQueue* q) { assert(q); return q-size 0; }队列长int QueueSize(LinkQueue* q) { assert(q); return q-size; }获取头的元素QDataType QueueFront(LinkQueue* q) { assert(q); assert(q-size0); return q-Phead-Next-data; }入队列void EnQueue(LinkQueue* q, QDataType x) { assert(q); QNode* newNode (QNode*)malloc(sizeof(QNode)); if (newNode NULL) { perror(malloc fail); return; } newNode-data x; newNode-Next NULL; q-Ptail-Next newNode; q-Ptail newNode; q-size; }出队列QDataType DeQueue(LinkQueue* q) { assert(q); assert(q-size0); QNode* delNode q-Phead-Next; QDataType x delNode-data; q-Phead-Next delNode-Next; free(delNode); delNode NULL; q-size--; if (q-size 0) { q-Ptail q-Phead; } return x; }这里有一个特殊的情况删除最后一个节点的时候Ptail和Phead都要置为NULL避免野指针。

相关新闻

大模型微调完整分类

大模型微调完整分类

一、按训练目标 / 训练阶段(日常说的 SFT、偏好、强化微调)1. 普通微调(SFT 监督指令微调)就是你说的「普通微调」,最基础一环全称:Supervised Fine-Tuning 监督微调数据:标准问答、对话、领域标…

2026/7/25 22:03:06 阅读更多 →
AI日报:自动化采集与专业筛选的技术实践

AI日报:自动化采集与专业筛选的技术实践

1. 项目概述2026年6月30日AI日报是一个聚焦人工智能领域最新动态的资讯项目。作为长期跟踪AI技术发展的从业者,我每天都会整理行业内的突破性进展、重要论文发布、企业动态和开源项目更新。这个日报不同于普通的新闻聚合,而是经过专业筛选和深度解读的技…

2026/7/26 0:58:08 阅读更多 →
n8n运维实战:日志管理、监控与安全配置

n8n运维实战:日志管理、监控与安全配置

1. 为什么n8n实例需要完整的运维体系 当你在生产环境运行n8n工作流引擎时,会发现这个看似简单的工具背后隐藏着复杂的运维需求。我部署的第一个n8n实例就曾因为日志堆积导致磁盘爆满,整个服务突然崩溃。那次事故让我意识到:n8n作为自动化枢纽…

2026/7/22 10:58:55 阅读更多 →

最新新闻

抖音内容高效管理:Douzy桌面版批量下载工具深度指南

抖音内容高效管理:Douzy桌面版批量下载工具深度指南

抖音内容高效管理:Douzy桌面版批量下载工具深度指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…

2026/7/26 0:58:55 阅读更多 →
3种方法解决Zwift-Offline更新异常:快速恢复离线骑行体验

3种方法解决Zwift-Offline更新异常:快速恢复离线骑行体验

3种方法解决Zwift-Offline更新异常:快速恢复离线骑行体验 【免费下载链接】zwift-offline Use Zwift offline 项目地址: https://gitcode.com/gh_mirrors/zw/zwift-offline Zwift-Offline是一个开源项目,允许用户在离线环境下运行Zwift虚拟骑行游…

2026/7/26 0:58:55 阅读更多 →
NsEmuTools:3分钟搞定NS模拟器安装配置的终极解决方案

NsEmuTools:3分钟搞定NS模拟器安装配置的终极解决方案

NsEmuTools:3分钟搞定NS模拟器安装配置的终极解决方案 【免费下载链接】ns-emu-tools 一个用于安装/更新 NS 模拟器的工具 项目地址: https://gitcode.com/gh_mirrors/ns/ns-emu-tools 还在为NS模拟器的繁琐配置而头疼吗?NsEmuTools作为一款开源免…

2026/7/26 0:58:55 阅读更多 →
3分钟免费完成PDF扫描效果:LookScanned.io终极指南

3分钟免费完成PDF扫描效果:LookScanned.io终极指南

3分钟免费完成PDF扫描效果:LookScanned.io终极指南 【免费下载链接】lookscanned.io 📚 LookScanned.io - Make your PDFs look scanned 项目地址: https://gitcode.com/gh_mirrors/lo/lookscanned.io 你是否曾为找不到扫描仪而烦恼?是…

2026/7/26 0:58:55 阅读更多 →
3种实战方案:从基础到专业的Hackintosh显示效果调校指南

3种实战方案:从基础到专业的Hackintosh显示效果调校指南

3种实战方案:从基础到专业的Hackintosh显示效果调校指南 【免费下载链接】Hackintosh Hackintosh long-term maintenance model EFI and installation tutorial 项目地址: https://gitcode.com/gh_mirrors/ha/Hackintosh 黑苹果显示优化、显卡驱动配置、分辨…

2026/7/26 0:58:55 阅读更多 →
免费开源Windows桌面分区神器:NoFences终极整理指南

免费开源Windows桌面分区神器:NoFences终极整理指南

免费开源Windows桌面分区神器:NoFences终极整理指南 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 还在为杂乱无章的Windows桌面而烦恼吗?每次寻找文…

2026/7/26 0:57:55 阅读更多 →

日新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

月新闻