数据结构————栈

一.栈

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上的一道例题,有兴趣大家可以去试一试
有效括号

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1140952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

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

stm32处理器对中断的响应说明

一、问题 1.stm32处理器每秒能够响应多少次中断? 2.stm32处理器每秒能够响应多少次周期性均匀的中断? 3.如何定量和定性的分析stm32处理器能够在单位每秒时间响应中断的次数呢?二、stm32处理的中断说明 1.需要了解stm32处理器的中断机制 2.需…

教AI学会说“我是小喵“竟然这么神奇?LlamaFactory微调揭秘

当AI也需要"自我介绍"你有没有想过,当你问ChatGPT"你是谁"的时候,它为什么知道自己是由OpenAI开发的?而不是说"我是小度,百度出品"?这就像你教小孩子自我介绍一样——"你好&#x…

基于Simulink的车与行人(V2P)通信仿真(行人预警场景)

目录 手把手教你学Simulink 一、引言:为什么“智能汽车需要V2P”? 二、V2P 系统架构总览 关键组件: 三、BSM-P 消息结构(SAE J2735 扩展) 四、V2P 通信技术选型 五、碰撞风险评估模型 1. 行人预测位置(匀速模型): 2. 车辆预测位置: 3. 最小距离预测: 4. 风…

exe打开应用程序无法启动,因为应用程序的并行配置不正确

问题现象描述:exe打开应用程序无法启动,因为应用程序的并行配置不正确。问题分析:将exe文件放到其他电脑确可以运行,由此确定不是exe问题,而是系统哪里出现问题。然后又随便复制其他exe放有问题电脑上可以打开&#xf…

基于Simulink的智能车辆雨天行驶仿真(感知与控制)

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

华为研究团队突破代码修复瓶颈,8B模型击败32B巨型对手!

这项由华为技术有限公司、南洋理工大学、香港大学和香港中文大学联合完成的突破性研究发表于2026年1月,论文编号为arXiv:2601.01426v1。研究团队通过一种名为SWE-Lego的创新训练方法,让相对较小的8B参数模型在软件代码自动修复任务上的表现超越了许多32B…

2026继续教育必备10个降AI率工具测评榜单

2026继续教育必备10个降AI率工具测评榜单 2026年继续教育者为何需要专业降AI率工具? 在2026年的学术与职业发展环境中,继续教育已成为提升竞争力的重要途径。然而,随着AI生成内容检测技术的不断升级,越来越多的学习者和研究者遭遇…

[转]5 个很火火的个人 AI 知识库 GitHub 项目,收藏一波。

01 siyuan:个人知识管理工具 这个叫 思源笔记的开源项目,肯定很多人用过。在 GitHub 上都有 4 万的 Star 了。 它在极致的编辑体验与绝对的数据隐私之间找到平衡点,它不仅是一个笔记工具,更是一个基于本地的个人知识管理系统。 而…

ios应用为什么需要“签名”?揭开苹果签名的神秘面纱,从原理到方案一次讲透

在iOS世界里,“签名”这个词几乎无处不在,却又常常让人感到困惑。为什么iPhone不能像安卓一样随便安装APK?为什么安装企业App时要“信任开发者”?为什么有的应用突然打不开,提示“未受信任的开发者”?这些问…

全网最全2026本科生AI论文网站TOP9测评

全网最全2026本科生AI论文网站TOP9测评 2026年本科生AI论文写作工具测评:从功能到体验的深度解析 随着人工智能技术在学术领域的广泛应用,越来越多的本科生开始借助AI工具辅助论文写作。然而,面对市场上种类繁多的平台,如何选择真…

北京做牙冠一颗多少钱

北京做牙冠一颗多少钱?全面解析价格构成与选择指南 在北京进行牙齿修复,牙冠是恢复牙齿功能和美观的常见选择。许多市民在考虑此项治疗时,首要关心的问题便是“北京做牙冠一颗多少钱”。实际上,这个价格并非固定数字,…

AU-48双麦+USB全能语音模组:解锁全场景语音交互新体验

在智能语音交互全面渗透的当下,设备厂商既要攻克复杂环境下的拾音难题,又要解决多系统适配的集成痛点。AU-48双模拟麦多功能降噪回音消除模组精准切中需求核心,以双麦AI降噪全功能USB接口的黄金组合,实现“精准拾音便捷适配”双重…

学Simulink--V2X通信场景实例:基于Simulink的车与行人(V2P)通信仿真(行人预警场景)

目录 手把手教你学Simulink 一、引言:为什么“智能汽车需要V2P”? 二、V2P 系统架构总览 关键组件: 三、BSM-P 消息结构(SAE J2735 扩展) 四、V2P 通信技术选型 五、碰撞风险评估模型 1. 行人预测位置(匀速模型): 2. 车辆预测位置: 3. 最小距离预测: 4. 风…

学Simulink--特殊天气场景实例:基于Simulink的智能车辆雨天行驶仿真(感知与控制)

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

AU48 语音处理模组:全双工通话设备的性能升级优选方案

在智能语音交互场景持续拓展的当下,设备厂商对语音模组的需求已从 “能用” 转向 “好用”—— 既要兼容既有设备架构,又要解决复杂环境下的拾音、降噪、消回音痛点。AU48 语音处理模组作为上一代 A-47 的全面升级款,以 “兼容替代 性能跃升…

git创建远程分支、分支合并、删除分支

# git创建远程分支 #查看分支 git branch -a#创建git分支 git checkout -b branch_name#push到远程仓库 git push -u origin branch_name# git 合并分支 # 标准合并(保留分支历史) git checkout master # 先切到要「接受」变更的分支 git pull …

语言模型在跨语言推理任务中的表现研究

语言模型在跨语言推理任务中的表现研究关键词:语言模型、跨语言推理任务、多语言处理、语义理解、推理能力摘要:本文聚焦于语言模型在跨语言推理任务中的表现。随着全球化的发展,跨语言交流与信息处理需求日益增长,跨语言推理任务…

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

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

大模型学习路线:从LLM原理到Agent开发的完整指南,助你快速掌握AI核心技术【强烈收藏】

本文系统梳理了AI大模型学习路线,涵盖LLM核心原理、预训练细节、后训练技术(SFT、LoRA、RLHF)以及RAG和Agent应用开发。文章指出,后训练和AI-Agent开发是当前工业界最缺人、性价比最高的方向,提供了从基础认知到面试求职的6大模块学习清单&am…