news 2026/4/15 16:45:49

数据结构————栈

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据结构————栈

一.栈

1. 栈的的概念

栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素的操作。进行元素插入和删除的一段是栈顶,另一端是栈底。栈中的元素遵从后进先出LIFO(Last In First Out)的原则。

  • 压栈:栈的插入操作叫做进栈/入栈,入数据在栈顶。
  • 出栈:栈的删除操作叫做出栈/出数据在栈顶。

2.栈的结构

3.栈的状态

3.1. 空栈

3.1.1.概念:

指栈中没有任何元素,栈顶指针(或列表长度)指向 “” 的位置

3.2.满栈

3.2.1.概念:

满栈仅针对顺序栈(数组 / 列表实现的栈),指栈中元素数量达到了预设的最大容量,无法再执行入栈操作

3.3.递归栈

3.3.1.概念:

递归栈不是一种物理栈,而是程序执行递归函数时,操作系统 / 解释器为其维护的函数调用栈。每一次递归调用都会将函数的上下文(参数、局部变量、返回地址)压入栈;每一次递归返回(执行完当前函数),都会将该上下文弹出栈。

3.4.递减栈

3.4.1.概念:

递减栈(也叫 “单调递减栈”)是一种算法技巧(而非基础数据结构),指栈内的元素始终保持严格递减(或非递增)的顺序。入栈时会主动弹出不符合递减规则的元素,确保栈的单调性。

二.栈的实现

顺序栈(用数组实现)

函数接口

#defineMAX_SIZE100// 定义栈的最大容量typedefintSTDataType;// 栈中元素的类型// 顺序栈结构体typedefstructStack{STDataType a[MAX_SIZE];// 数组用于存储栈元素inttop;// 栈顶指针}Stack;// 初始化栈voidSTInit(Stack*ps);// 判断栈是否为空intSTEmpty(Stack*ps);// 判断栈是否为满intSTFull(Stack*ps);// 入栈操作voidSTPush(Stack*ps,STDataType x);// 出栈操作voidSTPop(Stack*ps);// 查看栈顶元素STDataTypeSTTop(Stack*ps);// 获取栈的大小intSTSize(Stack*ps);
初始化
// 初始化栈voidSTInit(Stack*ps){assert(ps);ps->top=-1;// 初始化栈顶指针为-1,表示栈为空}
判断是否为空
// 判断栈是否为空intSTEmpty(Stack*ps){assert(ps);returnps->top==-1;// 如果栈顶指针为-1,表示栈为空}
判断是否满了
// 判断栈是否为满intSTFull(Stack*ps){assert(ps);returnps->top==MAX_SIZE-1;// 如果栈顶指针等于最大容量减1,表示栈已满}
入栈
// 入栈操作voidSTPush(Stack*ps,STDataType x){assert(ps);if(STFull(ps)){printf("栈已满,无法入栈!\n");return;}ps->a[++(ps->top)]=x;// 将元素放入栈顶,并更新栈顶指针}
出栈
// 出栈操作voidSTPop(Stack*ps){assert(ps);if(STEmpty(ps)){printf("栈为空,无法出栈!\n");return;}ps->top--;// 更新栈顶指针,删除栈顶元素}
查看栈顶元素
// 查看栈顶元素STDataTypeSTTop(Stack*ps){assert(ps);if(STEmpty(ps)){printf("栈为空,无法查看栈顶元素!\n");return-1;// 如果栈为空,返回一个非法值}returnps->a[ps->top];// 返回栈顶元素}
有效元素个数
// 获取栈的大小intSTSize(Stack*ps){assert(ps);returnps->top+1;// 栈的大小等于栈顶指针+1}

链式栈(用链表实现)

函数接口

typedefintSTDataType;//动态typedefstructStack{int*a;inttop;intcapacity;}ST;voidSTInit(ST*ps);voidSTDestory(ST*ps);voidSTPush(ST*ps,STDataType x);voidSTPop(ST*ps);intSTSize(ST*ps);boolSTEmpty(ST*ps);STDataTypeSTTop(ST*ps);
初始化
#include"STack.h"voidSTInit(ST*ps){assert(ps);ps->a=(STDataType*)malloc(sizeof(STDataType)*4);if(ps->a==NULL){perror("malloc failed");return;}ps->capacity=4;ps->top=0;//top栈顶元素的下一个位置//ps->top = -1;//top是栈顶元素位置}
销毁
voidSTDestory(ST*ps){assert(ps);free(ps);ps->a=NULL;ps->capacity=0;ps->top=0;}
进栈
voidSTPush(ST*ps,STDataType x){assert(ps);if(ps->top==ps->capacity){STDataType*tmp=(STDataType*)realloc(ps->a,sizeof(STDataType)*ps->capacity*2);if(tmp==NULL){perror("realloc failed");return;}ps->a=tmp;ps->capacity*=2;}ps->a[ps->top]=x;ps->top++;}
出栈
voidSTPop(ST*ps){assert(ps);assert(!STEmpty(ps));ps->top--;}
有效元素个数
intSTSize(ST*ps){assert(ps);returnps->top;}
判断是否为空
boolSTEmpty(ST*ps){assert(ps);returnps->top==0;}
获取栈顶元素
STDataTypeSTTop(ST*ps){assert(ps);assert(!STEmpty(ps));returnps->a[ps->top-1];}

三.栈的应用

1.递归

2.括号的匹配

这是leetcode上的一道例题,有兴趣大家可以去试一试
有效括号

希望大家能支持关注一下新人博主,谢谢。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 4:59:33

基于SpringBoot的社区物资交易互助平台毕业设计

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在构建一个基于SpringBoot框架的社区物资交易互助平台,以实现社区内物资的有效流通和共享,提高社区成员的生活质量。具体研究目的…

作者头像 李华
网站建设 2026/4/15 13:19:40

基于Simulink的智能车辆雨天行驶仿真

目录 手把手教你学Simulink 一、引言:为什么“智能汽车需要雨天仿真”? 二、雨天仿真系统架构总览 输入: 输出: 三、关键模型1:降雨强度与路面附着系数 四、关键模型2:传感器性能降级建模 1. 摄像头(视觉) 2. 毫米波雷达 3. 激光雷达(LiDAR) 五、自适应控制…

作者头像 李华
网站建设 2026/4/15 12:41:59

信创电话助手电话录音盒操作系统兼容性

一、国产 Linux 桌面操作系统(仅支持桌面版,不支持服务器版) ✅ 支持的操作系统 麒麟(Kylin)统信 UOSDeepin欧拉(OpenEuler)【注:仅限桌面发行版】 ✅ 系统要求 内核版本&#x…

作者头像 李华
网站建设 2026/4/10 2:34:54

吐血推荐专科生必用TOP8AI论文平台

吐血推荐专科生必用TOP8AI论文平台 2026年专科生必备AI论文平台测评解析 随着人工智能技术的不断进步,越来越多的学术辅助工具进入高校师生的视野,尤其对于专科生而言,论文写作往往面临时间紧张、资料查找困难、格式不规范等多重挑战。为了帮…

作者头像 李华
网站建设 2026/4/16 4:26:05

HY-MT1.5-7B A/B测试:不同参数版本效果对比部署方案

HY-MT1.5-7B A/B测试:不同参数版本效果对比部署方案 1. 引言 随着多语言交流需求的不断增长,高质量、低延迟的翻译模型成为智能应用的核心组件。腾讯近期开源了混元翻译大模型1.5版本(HY-MT1.5),包含两个关键模型&am…

作者头像 李华