当前位置: 首页 > news >正文

数据结构——栈(附图文讲解 | 超详细)

文章目录

    • 一、前言
    • 二、栈
      • 2.1 定义
        • 1.后进先出
        • 2.压栈和出栈
      • 2.2 栈的实现
        • 1. 创建栈
        • 2. 栈的初始化
        • 3. 栈的销毁
        • 4. 入栈
        • 5. 判断栈是否为空
        • 6. 出栈
        • 7. 取栈顶
        • 8. 有效元素个数
    • 三、完整代码
        • Stack.h
        • Stack.c
        • test.c

一、前言

这篇博客我们来聊聊数据结构——栈

二、栈

2.1 定义

概念:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作。进⾏数据插⼊和删除操作的⼀端称为栈顶,另⼀端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

1.后进先出

那么是什么是后进先出呢?

先进去的数据后出来,而后进去的数据先出来

如图:

2.压栈和出栈

压栈:栈的插⼊操作叫做进栈/压栈/⼊栈,⼊数据在栈顶

出栈:栈的删除操作叫做出栈。出数据也在栈顶

2.2 栈的实现

对于栈的实现来说可以使⽤数组或者链表实现,相对⽽⾔数组的结构实现更优⼀些。因为数组在尾上插⼊数据的代价⽐较⼩。所以我们这里用数组来实现。

1. 创建栈
//栈typedefintSTDataType;//自定义数据元素类型typedefstructStack{STDataType*arr;inttop;//有效数据个数intcapacity;//空间容量}ST;
2. 栈的初始化
//初始化voidStackInit(ST*ps){ps->arr=NULL;ps->top=ps->capacity=0;}
3. 栈的销毁
//栈的销毁voidStackDestroy(ST*ps){if(ps->arr)free(ps->arr);ps->arr=NULL;ps->top=ps->capacity=0;}
4. 入栈

先向内存申请空间,再从栈顶入栈

//入栈——栈顶voidStackPush(ST*ps,STDataType x){assert(ps);if(ps->top==ps->capacity){intnewCapacity=ps->capacity==0?4:2*ps->capacity;STDataType*tmp=(STDataType*)realloc(ps->arr,newCapacity*sizeof(STDataType));if(tmp==NULL){perror("realloc fail!");exit(1);}ps->arr=tmp;ps->capacity=newCapacity;}ps->arr[ps->top++]=x;}
5. 判断栈是否为空

用于之后的功能接口进行断言

//判断栈是否为空boolStackEmpty(ST*ps){assert(ps);returnps->top==0;}
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#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<stdbool.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
#include"Stack.h"//初始化voidStackInit(ST*ps){ps->arr=NULL;ps->top=ps->capacity=0;}//销毁voidStackDestroy(ST*ps){if(ps->arr)free(ps->arr);ps->arr=NULL;ps->top=ps->capacity=0;}//入栈——栈顶voidStackPush(ST*ps,STDataType x){assert(ps);if(ps->top==ps->capacity){intnewCapacity=ps->capacity==0?4:2*ps->capacity;STDataType*tmp=(STDataType*)realloc(ps->arr,newCapacity*sizeof(STDataType));if(tmp==NULL){perror("realloc fail!");exit(1);}ps->arr=tmp;ps->capacity=newCapacity;}ps->arr[ps->top++]=x;}//判断栈是否为空boolStackEmpty(ST*ps){assert(ps);returnps->top==0;}//出栈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
#include"Stack.h"voidtest01(){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);//}intsize=StackSize(&st);printf("size:%d\n",size);StackDestroy(&st);}intmain(){test01();//测试return0;}
http://www.jsqmd.com/news/1403125/

相关文章:

  • 沧州 2026 瓷砖空鼓精选靠谱商家推荐:全屋瓷砖空鼓检测治理 - 屋工匠
  • 赣州 2026 瓷砖空鼓精选靠谱商家推荐:全屋瓷砖空鼓检测治理 - 屋工匠
  • IIS管理器全攻略:从入门到精通,掌握Windows Web服务器核心管理工具
  • 光耦固态继电器 : 筑牢智能养殖的可靠控制基石
  • OpenClaw框架:构建可控AI Agent的4包7层嵌入式架构实践
  • 潍坊 2026 瓷砖空鼓精选靠谱商家推荐:免砸砖空鼓注浆加固施工 - 屋工匠
  • 简单讲解Java--queue--三组成对出现的方法的区别
  • 主流OJ平台深度横评:从POJ到洛谷,算法学习者的实战指南
  • 【软考】2023年下半年信息安全工程师《综合知识》完整真题及解析
  • 网络拓扑结构全解析:从星型到网状,五大经典架构的工程实践与选型指南
  • 国产板级EDA软件:从核心需求看现状、优势与挑战
  • 2026曲靖危房鉴定检测怎么选?老旧房危房鉴定靠谱机构 TOP 结构安全检测+ 报告可查 电话汇总
  • 携程被罚51.79亿,酒店商家的OTA运营该换思路了
  • Model Context Protocol 优先级队列暴走:P0 工单被 Claude Code 丢进下个月
  • GitHub Copilot 补单元测试:覆盖率从20%飙升到85%,却漏了这5类边界用例
  • 2026年淡黄色透明液体N生产厂家实力解析:高纯度合成工艺与稳定性应用探讨 - 卓企推荐
  • 库尔勒市房屋漏水维修怎么防被坑不被套路_阳台漏水家庭渗水维修圈套拆解,住户避雷心得汇总,甄别要点 - 雨婺虹修缮
  • 企业级AI Agent长期记忆架构实战:LangGraph与向量数据库集成方案
  • GN与Ninja构建系统实战:从原理到大型C++项目高效编译
  • 毕业论文开题|零经验小白也能一次过的稳妥方法✅
  • 合肥 2026 瓷砖空鼓精选靠谱商家推荐:阳台墙砖松动加固维修 - 屋工匠
  • OpenClaw AI智能体框架:从核心概念到实战部署的完整指南
  • 从龙虾生存策略到高效工作法:时间盒、信息过滤与优先级管理
  • 腾讯云服务器安装Redis Stack图文教程
  • Spring Boot 2.0整合Druid连接池:监控配置、多数据源与生产环境调优实战
  • AI编程工具Cursor Pro与Fable 5实战指南:从环境配置到高效工作流
  • 为什么一双安全鞋,要做到这么多?
  • 优学教育机构
  • 南阳 2026 瓷砖空鼓精选靠谱商家推荐:厨房瓷砖空鼓微创修复 - 屋工匠
  • 2026濮阳危房鉴定检测怎么选?老旧房危房鉴定靠谱机构 TOP 结构安全检测+ 报告可查 电话汇总