news 2026/4/12 13:14:50

数据结构————栈

作者头像

张小明

前端开发工程师

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/5 8:35:33

DBdoctor SQL审核:COST+AI双核驱动,彻底终结低效SQL!

一、行业痛点:为什么传统的SQL审核依然“防不胜防”? 在数字化系统中,数据库如心脏,SQL如血液,而SQL质量问题则像“隐形血栓”,随时可能引发系统瘫痪。 尽管80%的数据库性能问题根源于SQL,且多数…

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

数据中台建设中的成本优化:大数据平台降本增效实践

数据中台不“烧钱”:大数据平台降本增效的实战方法论 引言:你是不是也在为数据中台的“账单”头疼? 上个月和一位零售企业的数据总监聊天,他的吐槽让我瞬间共鸣: 年初刚花200万扩容了Hadoop集群,结果监控…

作者头像 李华
网站建设 2026/4/11 7:38:27

Index十年演进(2015–2025)

Index十年演进(2015–2025) 一句话总论: 2015年Index还是“手工规则小样本标注单一任务分类”的浅层时代,2025年已进化成“万亿级多模态VLA统一Index实时意图级检索量子鲁棒自进化全域社交/具身知识索引”的普惠智能时代&#xff…

作者头像 李华
网站建设 2026/4/10 7:26:33

华为OD机试 - 整型数组按照个位数排序(Java 双机位C卷 100分)

华为OD机试 双机位C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的…

作者头像 李华
网站建设 2026/4/11 10:07:37

土木工程生就业难?靠远程工作,我找到了高薪稳定工作

作为2025届土木工程毕业生,我曾和无数同专业同学一样陷入就业焦虑:校招时,房企裁员缩招、施工单位岗位缩减,好不容易拿到的几个offer不是需要常年驻场偏远工地,就是薪资微薄且晋升渺茫;身边不少同学要么被迫…

作者头像 李华