数据结构篇(五):线性表——栈
前言前面几篇讲了顺序表、单链表和双链表它们都是线性表的基础实现方式。而栈和队列本质上是对线性表的操作方式做了限制之后得到的两种特殊线性结构。本文来讲讲栈——一种后进先出的数据结构理解它是后续学习递归、DFS、表达式求值、括号匹配等内容的基础。一、什么是栈栈Stack是一种只允许在一端进行插入和删除操作的线性表。允许操作的一端叫栈顶top另一端叫栈底bottom。栈的核心特性是后进先出LIFOLast In First Out数据压入栈的顺序和弹出栈的顺序正好相反最后进栈的元素最先出来。生活中的例子1.一摞盘子只能从最上面拿也只能从最上面放2.浏览器的后退功能3.函数调用时的调用栈每次函数调用都会压栈返回时弹栈。二、栈的实现方式栈可以用数组实现也可以用链表实现。数组实现从数组尾部进行插入删除不需要挪动数据效率是O(1)且实现简单是实际中最常用的方式类似于顺序表的尾插尾删链表实现如果用链表实现一般选择在链表头部进行插入删除这样效率也是O(1)但相对数组实现要多一层指针操作实际使用较少。本文以数组实现为主进行讲解。三、栈的结构定义栈本质上就是一个支持动态扩容的顺序表只是把操作限制在了一端栈顶。typedef int STDataType; typedef struct Stack { STDataType* array; // 存储数据的数组 int top; // 栈顶下标也可以用size表示元素个数 int capacity; // 容量 } Stack;四、栈的基本操作4.1 初始化void StackInit(Stack* ps) { ps-array NULL; ps-top 0; // top指向栈顶元素的下一个位置初始为0表示空栈 ps-capacity 0; }4.2 检查容量扩容​void StackCheckCapacity(Stack* ps) { if (ps-top ps-capacity) { int newCapacity ps-capacity 0 ? 4 : ps-capacity * 2; STDataType* tmp (STDataType*)realloc(ps-array, newCapacity * sizeof(STDataType)); if (tmp NULL) { perror(realloc fail); exit(-1); } ps-array tmp; ps-capacity newCapacity; } }4.3 入栈Pushvoid StackPush(Stack* ps, STDataType x) { assert(ps ! NULL); StackCheckCapacity(ps); ps-array[ps-top] x; ps-top; }4.4 出栈Popvoid StackPop(Stack* ps) { assert(ps ! NULL); assert(ps-top 0); // 栈不能为空 ps-top--; }4.5 取栈顶元素TopSTDataType StackTop(Stack* ps) { assert(ps ! NULL); assert(ps-top 0); return ps-array[ps-top - 1]; }4.6 判空bool StackEmpty(Stack* ps) { assert(ps ! NULL); return ps-top 0; }4.7 获取有效元素个数int StackSize(Stack* ps) { assert(ps ! NULL); return ps-top; }4.8 销毁void StackDestroy(Stack* ps) { assert(ps ! NULL); free(ps-array); ps-array NULL; ps-top ps-capacity 0; }五、完整测试代码int main() { Stack st; StackInit(st); StackPush(st, 1); StackPush(st, 2); StackPush(st, 3); StackPush(st, 4); printf(栈顶元素: %d\n, StackTop(st)); // 4 while (!StackEmpty(st)) { printf(%d , StackTop(st)); StackPop(st); } printf(\n); // 4 3 2 1正好和入栈顺序相反 StackDestroy(st); return 0; }六、时间复杂度分析操作时间复杂度说明入栈 pushO(1)均摊不涉及数据搬移出栈 popO(1)只需移动top取栈顶 topO(1)直接访问下标判空 emptyO(1)判断top是否为0栈的所有标准操作都是O(1)这也是为什么用数组实现栈是最优选择——完全不需要像顺序表那样考虑头部/中间插入删除因为栈根本不允许这样操作。七、栈的经典应用场景栈在实际开发和算法题中出镜率非常高常见应用包括括号匹配判断字符串中的()[]{}是否匹配利用栈后进先出的特性左括号入栈遇到右括号就弹栈比对逆波兰表达式后缀表达式求值操作数入栈遇到运算符就弹出栈顶两个元素运算结果再入栈函数调用栈程序运行时每次函数调用都会在栈上开辟一块栈帧保存局部变量、返回地址等信息函数返回时栈帧弹出这也是递归可能导致栈溢出Stack Overflow的根本原因浏览器前进后退、编辑器撤销重做Undo/Redo本质上都是用栈记录历史状态深度优先遍历DFS可以用递归实现也可以用显式栈模拟递归过程避免递归层数过深导致栈溢出。八、数组实现 vs 链表实现栈特性数组实现链表实现头部操作push/pop效率O(1)均摊O(1)空间利用率可能有扩容冗余每个节点有指针开销但按需申请实现复杂度简单相对复杂需要动态申请/释放节点缓存利用率高连续内存低不连续实际使用更常用较少一般只在教学中讲解综合来看实际开发和面试中栈基本都用数组来实现C STL中的stack默认底层容器也是deque本质上也是连续存储结构的组合。九、总结栈是一种操作受限的线性表核心特性只有一句话后进先出。它的实现并不复杂本质上就是只能在一端操作的顺序表所有标准操作的时间复杂度都是O(1)。真正的难点和考察重点在于灵活运用——括号匹配、表达式求值、单调栈、DFS模拟等都是建立在栈这个基础结构之上的经典问题建议在掌握实现之后多刷一些栈相关的算法题巩固理解。如果这篇文章对你有帮助欢迎点赞收藏下一篇预告队列的实现与应用敬请期待

相关新闻

Java 实现带头结点的单链表

Java 实现带头结点的单链表

一、思路说明头结点(Head):不存储有效数据,仅作为链表入口,统一空链表、非空链表操作逻辑,无需特殊处理首节点插入 / 删除。节点类:存储数据 下一个节点引用。链表核心操作:增、删、…

2026/7/25 3:11:38 阅读更多 →
Codex客户端接入DeepSeek API的三种方式全解析:从官方到自建代理

Codex客户端接入DeepSeek API的三种方式全解析:从官方到自建代理

1. 先搞清楚 Codex 到底是什么,以及为什么接入 DeepSeek 值得一试如果你在找 Codex 的教程,大概率是想找一个能写代码、能聊天的 AI 助手,并且希望它能用上 DeepSeek 这个模型。我直接说结论:Codex 本身是一个需要接入大模型才能工…

2026/7/25 17:31:28 阅读更多 →
AI工具链如何革新技术专著创作流程

AI工具链如何革新技术专著创作流程

1. 专著创作的新范式:AI工具链的价值定位写书这件事正在经历一场技术革命。去年我完成第三本技术专著时,整个写作周期比前两本缩短了40%,关键就在于构建了一套完整的AI辅助工作流。不同于简单的语法检查工具,现代AI写作助手已经能…

2026/7/25 22:37:46 阅读更多 →

最新新闻

palera1n越狱工具:解锁A8-A11设备的终极解决方案

palera1n越狱工具:解锁A8-A11设备的终极解决方案

palera1n越狱工具:解锁A8-A11设备的终极解决方案 【免费下载链接】palera1n Jailbreak for A8 through A11, T2 devices, on iOS/iPadOS/tvOS 15.0, bridgeOS 5.0 and higher. 项目地址: https://gitcode.com/GitHub_Trending/pa/palera1n 在iOS越狱的世界里…

2026/7/26 18:44:05 阅读更多 →
Django计算机毕设之基于 Web 的在线教学课程服务平台设计基于 Django 的 高校网课资源发布与自主学习系统开发(完整前后端 代码+说明文档+LW,调试定制等)

Django计算机毕设之基于 Web 的在线教学课程服务平台设计基于 Django 的 高校网课资源发布与自主学习系统开发(完整前后端 代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/26 18:44:05 阅读更多 →
20260725 见证奇迹

20260725 见证奇迹

我: “写个计算3阶行列式的应用,简单,易用。可以产生随机数,给出计算过程,方便验证。”5分钟后(用授课老师的话说,一个专业前端可能需要一个下午):CodeArt 智能体(Vibe模…

2026/7/26 18:44:05 阅读更多 →
Chatterbox TTS终极指南:23种语言语音合成的完整实战教程

Chatterbox TTS终极指南:23种语言语音合成的完整实战教程

Chatterbox TTS终极指南:23种语言语音合成的完整实战教程 【免费下载链接】chatterbox SoTA open-source TTS 项目地址: https://gitcode.com/GitHub_Trending/chatterbox7/chatterbox Chatterbox是由Resemble AI开发的开源语音合成(TTS&#xff…

2026/7/26 18:44:05 阅读更多 →
MaxKB完全实战指南:三步构建企业级智能体平台

MaxKB完全实战指南:三步构建企业级智能体平台

MaxKB完全实战指南:三步构建企业级智能体平台 【免费下载链接】MaxKB 🔥 MaxKB is an open-source platform for building enterprise-grade agents. 强大易用的开源企业级智能体平台。 项目地址: https://gitcode.com/GitHub_Trending/ma/MaxKB …

2026/7/26 18:44:05 阅读更多 →
ChatPicMigrator4QQNT:QQ升级无忧!一键迁移图片视频的终极解决方案

ChatPicMigrator4QQNT:QQ升级无忧!一键迁移图片视频的终极解决方案

ChatPicMigrator4QQNT:QQ升级无忧!一键迁移图片视频的终极解决方案 【免费下载链接】ChatPicMigrator4QQNT 项目地址: https://gitcode.com/gh_mirrors/ch/ChatPicMigrator4QQNT 还在为升级到新版QQ NT而烦恼吗?担心旧版QQ中的珍贵图…

2026/7/26 18:43:05 阅读更多 →

日新闻

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

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

深度学习道路桥梁裂缝检测系统 数据集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 阅读更多 →

月新闻