数据结构——栈(附图文讲解 | 超详细)
文章目录一、前言二、栈2.1 定义1.后进先出2.压栈和出栈2.2 栈的实现1. 创建栈2. 栈的初始化3. 栈的销毁4. 入栈5. 判断栈是否为空6. 出栈7. 取栈顶8. 有效元素个数三、完整代码Stack.hStack.ctest.c一、前言这篇博客我们来聊聊数据结构——栈二、栈2.1 定义概念⼀种特殊的线性表其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶另⼀端称为栈底。栈中的数据元素遵守后进先出LIFOLast In First Out的原则。1.后进先出那么是什么是后进先出呢先进去的数据后出来而后进去的数据先出来如图2.压栈和出栈压栈栈的插⼊操作叫做进栈/压栈/⼊栈⼊数据在栈顶。出栈栈的删除操作叫做出栈。出数据也在栈顶。2.2 栈的实现对于栈的实现来说可以使⽤数组或者链表实现相对⽽⾔数组的结构实现更优⼀些。因为数组在尾上插⼊数据的代价⽐较⼩。所以我们这里用数组来实现。1. 创建栈//栈typedefintSTDataType;//自定义数据元素类型typedefstructStack{STDataType*arr;inttop;//有效数据个数intcapacity;//空间容量}ST;2. 栈的初始化//初始化voidStackInit(ST*ps){ps-arrNULL;ps-topps-capacity0;}3. 栈的销毁//栈的销毁voidStackDestroy(ST*ps){if(ps-arr)free(ps-arr);ps-arrNULL;ps-topps-capacity0;}4. 入栈先向内存申请空间再从栈顶入栈//入栈——栈顶voidStackPush(ST*ps,STDataType x){assert(ps);if(ps-topps-capacity){intnewCapacityps-capacity0?4:2*ps-capacity;STDataType*tmp(STDataType*)realloc(ps-arr,newCapacity*sizeof(STDataType));if(tmpNULL){perror(realloc fail!);exit(1);}ps-arrtmp;ps-capacitynewCapacity;}ps-arr[ps-top]x;}5. 判断栈是否为空用于之后的功能接口进行断言//判断栈是否为空boolStackEmpty(ST*ps){assert(ps);returnps-top0;}6. 出栈从栈顶出栈//出栈voidStackPop(ST*ps){assert(!StackEmpty(ps));--ps-top;}7. 取栈顶取栈顶数据//取栈顶STDataTypeStackTop(ST*ps){assert(!StackEmpty(ps));returnps-arr[ps-top-1];}8. 有效元素个数//取有效元素个数intStackSize(ST*ps){returnps-top;}三、完整代码Stack.h#pragmaonce#includestdio.h#includestdlib.h#includeassert.h#includestdbool.h//栈typedefintSTDataType;typedefstructStack{STDataType*arr;inttop;intcapacity;}ST;//初始化voidStackInit(ST*ps);//销毁voidStackDestroy(ST*ps);//入栈——栈顶voidStackPush(ST*ps,STDataType x);//boolStackEmpty(ST*ps);//出栈voidStackPop(ST*ps);//取栈顶数据STDataTypeStackTop(ST*ps);//有效元素个数intStackSize(ST*ps);Stack.c#includeStack.h//初始化voidStackInit(ST*ps){ps-arrNULL;ps-topps-capacity0;}//销毁voidStackDestroy(ST*ps){if(ps-arr)free(ps-arr);ps-arrNULL;ps-topps-capacity0;}//入栈——栈顶voidStackPush(ST*ps,STDataType x){assert(ps);if(ps-topps-capacity){intnewCapacityps-capacity0?4:2*ps-capacity;STDataType*tmp(STDataType*)realloc(ps-arr,newCapacity*sizeof(STDataType));if(tmpNULL){perror(realloc fail!);exit(1);}ps-arrtmp;ps-capacitynewCapacity;}ps-arr[ps-top]x;}//判断栈是否为空boolStackEmpty(ST*ps){assert(ps);returnps-top0;}//出栈voidStackPop(ST*ps){assert(!StackEmpty(ps));--ps-top;}//取栈顶数据STDataTypeStackTop(ST*ps){assert(!StackEmpty(ps));returnps-arr[ps-top-1];}//有效元素个数intStackSize(ST*ps){returnps-top;}test.c#includeStack.hvoidtest01(){ST st;StackInit(st);StackPush(st,1);StackPush(st,2);StackPush(st,3);StackPush(st,4);StackPush(st,5);//StackPop(st);//StackPop(st);//StackPop(st);//StackPop(st);//StackPop(st);//while (!StackEmpty(st))//{// int top StackTop(st);// printf(%d , top);// StackPop(st);//}intsizeStackSize(st);printf(size:%d\n,size);StackDestroy(st);}intmain(){test01();//测试return0;}

相关新闻

从AI工具安装到工程化实战:OpenClaw-Codex工作流设计全解析

从AI工具安装到工程化实战:OpenClaw-Codex工作流设计全解析

最近在技术社区里,经常能看到关于“AI应用开发”的讨论,从“AI应用开发八股文”到“AI应用开发工程师招聘”,热度一直不减。很多开发者,尤其是刚接触这个领域的同学,常常会陷入一个误区:以为找到一个“最强…

2026/8/16 6:49:04 阅读更多 →
为什么服务器磁盘IO 100%,CPU 却很空闲?带你吃透底层原理

为什么服务器磁盘IO 100%,CPU 却很空闲?带你吃透底层原理

前言 很多新手运维、后端开发都会遇到一个非常迷惑的线上现象:服务器 CPU 使用率很低、内存充足,但业务接口疯狂超时、页面卡顿、数据库响应缓慢。 一、先搞懂:什么是 iowait(IO 等待)? 我们平时看到的 top…

2026/8/16 6:49:04 阅读更多 →
NEAL:基于Python的跨应用桌面自动化库,解放重复性工作

NEAL:基于Python的跨应用桌面自动化库,解放重复性工作

1. 项目概述:NEAL,一个被低估的自动化利器如果你在日常工作中,经常需要和Excel、Word、PDF、邮件、网页数据打交道,并且厌倦了重复、枯燥的“复制-粘贴-整理-发送”流程,那么NEAL这个开源项目,很可能就是你…

2026/8/16 6:49:04 阅读更多 →

最新新闻

购房发票丢失办不了业务?登报怎么弄?新手指南

购房发票丢失办不了业务?登报怎么弄?新手指南

不少家庭整理房产资料时,会发现购房发票找不到。等到要办理不动产权证、提取公积金、二手房过户的时候,才发现缺少这份票据,业务直接卡住。很多人第一反应到处找复印件,却不清楚购房发票遗失登报的完整流程,白白耽误办…

2026/8/16 7:30:16 阅读更多 →
医工交叉:非计算机背景医学研究者零基础入门AI科研的三大方向

医工交叉:非计算机背景医学研究者零基础入门AI科研的三大方向

最近在医学研究领域,一个普遍的焦虑正在蔓延:看着AI在医学影像、药物发现等领域大放异彩,许多临床医生或基础医学研究者却感到无从下手。他们手握宝贵的临床数据和深刻的领域知识,但面对复杂的代码、晦涩的算法和庞大的计算资源&a…

2026/8/16 7:30:16 阅读更多 →
深圳隔热膜稳妥商家看安装流程

深圳隔热膜稳妥商家看安装流程

好多深圳车主问我贴隔热膜找哪家靠谱,其实很多人都漏了关键一点——选隔热膜不只要看产品本身,施工规不规范才更影响最终效果。今天我就结合深圳本地实体门店的实际情况,跟大家聊聊选店最该关注的几个施工要点,帮大家做判断。无尘…

2026/8/16 7:30:16 阅读更多 →
桌面AI智能体WorkBuddy与OpenClaw对比:从安装部署到实战开发全解析

桌面AI智能体WorkBuddy与OpenClaw对比:从安装部署到实战开发全解析

1. 从“小龙虾”到“工作伙伴”:桌面AI智能体的新战局最近,一个名为WorkBuddy的桌面AI智能体应用悄然上线,被不少圈内人戏称为腾讯版的国产“小龙虾”。这个昵称的由来,自然是因为它直接对标了前段时间在开发者社区里掀起不小波澜…

2026/8/16 7:30:16 阅读更多 →
预装app的默认授权权限问题总结

预装app的默认授权权限问题总结

预装 App 的默认授权权限问题总结 一、问题背景 三个预装 APK 在首次开机后出现权限弹窗,需要手动授权才能使用: 应用包名弹窗权限com.mantou.test1访问通讯录、允许拨打电话和管理电话、允许从未知来源进行安装、设备管理应用、允许该应用访问使用数…

2026/8/16 7:30:16 阅读更多 →
十二草集:跳出洗护赛道同质化内卷,打造中式草本养发差异化标杆

十二草集:跳出洗护赛道同质化内卷,打造中式草本养发差异化标杆

当前国内洗护市场早已进入存量竞争、高度同质化内卷阶段。绝大多数洗护品牌陷入固定模板:统一网红香型、相似包装设计、通用化工配方、直播流量叫卖、主打低价走量。市面绝大多数草本洗护品牌,仅仅是在普通洗护产品中添加少量草本成分,套用“…

2026/8/16 7:29:16 阅读更多 →

日新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/16 6:00:23 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/16 6:00:24 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/16 6:00:27 阅读更多 →