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

数据结构:栈 及其应用

逻辑结构:

栈(Stack)是一种遵循后进先出(LIFO, Last In First Out)原则的有序集合 (受限的线性表)。这种数据结构只允许在栈顶进行添加(push)或删除(pop)元素的操作。栈是一种非常基础且重要的数据结构,广泛应用于计算机科学和软件开发中。

栈顶:插入和删除

栈底:固定的 不允许插入和删除

空栈:不含任何元素

栈的基本操作

  1. push(element): 向栈顶添加一个元素。如果栈已满,则可能无法进行此操作。
  2. pop(): 移除栈顶的元素,并返回该元素。如果栈为空,则可能无法进行此操作,并可能返回一个错误或特殊值(如nullundefined)。
  3. peek() 或 top(): 返回栈顶元素的值,但不从栈中移除它。如果栈为空,则可能返回一个错误或特殊值。
  4. isEmpty(): 检查栈是否为空。
  5. size(): 返回栈中元素的数量。

栈的存储结构:

栈可以通过多种方式实现,包括使用数组(或列表)和链表。

顺序存储:
  • 基于数组的栈(顺序栈):在这种实现中,数组的一端被用作栈顶。添加元素时,新元素被添加到数组的末尾;移除元素时,数组的最后一个元素被移除。这种实现方式在大多数编程语言中都非常高效,因为数组的末尾操作通常很快。

初始化:

# define MaxSize 50
typedef struct
{Elemtype data[MaxSize];int top;//栈顶指针}SqStack;//iniiallize
void initStack(SqStack &s){ 
s.top=-1;
}

判断非空:

//empty
bool StackEmpty(SqStack s){if(s.top==-1)return true;elsereturn false;
}

 进栈:

//in
bool Push(SqStack &s,Elemtype e){if(s.top==MaxSize-1)return false;else{s.top++;s.data[s.top]=e;}return true;}

进栈和出栈的操作 根据s.top的初始值不同而不同:
s.top=-1先指针+1再进栈,先出栈再指针-1;

s.top=0先进栈再指针+1,先指针-1再出栈; 

 出栈:

bool Pop(SqStack &s,Elemtype &e){if(s.top==-1)return false;e=s.data[s.top];s.top--;return true;
}

读取栈顶元素:

//read
bool GetTop(SqStack s,Elemtype &x){if(s.top==-1)return false;x=s.data[s.top];
return true;
}
 链式存储:
  • 基于链表的栈:下列代码规定没有头结点,LHead指向栈顶元素,链表的头部被用作栈顶。添加元素时,新元素被添加到链表的头部;移除元素时,链表的第一个元素(即头部元素)被移除。虽然链表在随机访问方面不如数组高效,但在某些情况下(如动态内存分配),链表可能更灵活。

//
typedef struct LinkNode
{Elemtype data;struct LinkNode *next;}LiStack;

栈的应用

栈的应用非常广泛,包括但不限于:

  • 函数调用

在大多数编程语言中,函数调用是通过栈来实现的。当函数被调用时,其返回地址和局部变量被推入栈中;当函数返回时,这些信息从栈中弹出。

  • 表达式求值

在编译器和解释器中,栈用于计算表达式的值。例如,在解析算术表达式时,可以使用栈来跟踪操作符和操作数。

中缀转后缀:

1)加括号:(( A +③( B *②( C -① D )))-©( E /④ F ))。

2)运算符后移:(( A ( B ( CD )-①)*②)+③( EF )/④)-⑤。

3)去除括号后,得到后缀表达式: ABCD -①*②+③ EF /④-⑤.

在计算机中,中缀表达式转后缀表达式时需要借助一个栈,用于保存暂时还不能确定运算顺序的运算符。从左到右依次扫描中缀表达式中的每一项,具体转化过程如下:
1)遇到操作数。直接加入后缀表达式。
2)遇到界限符。若为"(",则直接入栈;若为")",则依次弹出栈中的运算符,并加入后缀表达式,直到弹出"("为止。注意,"("直接删除,不加入后缀表达式。

3)遇到运算符。若其优先级高于除"("外的栈顶运算符,则直接入栈。否则,从栈顶开始,依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,直到遇到一个优先级低于它的运算符或遇到"("时为止,之后将当前运算符入栈。按上述方法扫描所有字符后,将栈中剩余运算符依次弹出,并加入后缀表达式。

转后缀图解(例子):

后缀表达式求值:

通过后缀表示计算表达式值的过程:从左往右依次扫描表达式的每一项,若该项是操作数,则将其压入栈中;若该项是操作符< op >,则从栈中退出两个操作数 Y 和 x ,形成运算指令 X < op > y ,并将计算结果压入栈中。当所有项都扫描并处理完后,栈顶存放的就是最后的计算结果。

后缀求值图解:

  • 括号匹配

栈可以用来检查括号(如圆括号、方括号和花括号)是否正确匹配。

  • 回溯算法

在解决某些问题时(如迷宫问题、八皇后问题等),栈可以用来保存中间状态,以便在需要时回溯到之前的状态。

  • 页面访问历史

在Web浏览器中,栈可以用来保存用户访问的页面历史,以便用户可以通过“后退”按钮返回到之前的页面。

总之,栈是一种简单但功能强大的数据结构,其独特的后进先出原则使得它在许多应用场景中都非常有用。

相关文章:

  • 多元函数微分学基础题
  • 【开源免费】基于SpringBoot+Vue.JS服装销售平台(JAVA毕业设计)
  • 【C++】二义性
  • ffmpeg拉取rtsp网络视频流报错解析
  • 学校周赛(2)
  • 如何在银河麒麟操作系统中查看内存页大小
  • 大数据Hologres(一):Hologres 简单介绍
  • 【数据结构初阶】排序算法(中)快速排序专题
  • 人工智能实战用折线图解读产业GDP发展态势
  • 【自用】jlu 数据库 第一章 Introduction
  • 大模型分布式训练并行技术(九)-总结
  • kubernetes配置资源管理
  • Python 从入门到实战31(数据库编程接口)
  • 【个人笔记】数据一致性的解决方案
  • MySQL-数据库约束
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • chrome扩展demo1-小时钟
  • Docker入门(二) - Dockerfile
  • FastReport在线报表设计器工作原理
  • golang中接口赋值与方法集
  • Lucene解析 - 基本概念
  • NSTimer学习笔记
  • PaddlePaddle-GitHub的正确打开姿势
  • pdf文件如何在线转换为jpg图片
  • springboot_database项目介绍
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 基于游标的分页接口实现
  • 简单基于spring的redis配置(单机和集群模式)
  • 前端面试题总结
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • #70结构体案例1(导师,学生,成绩)
  • #QT(智能家居界面-界面切换)
  • ( 10 )MySQL中的外键
  • (C语言)fread与fwrite详解
  • (k8s)kubernetes 部署Promehteus学习之路
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (SERIES12)DM性能优化
  • (ZT)出版业改革:该死的死,该生的生
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .net 8 发布了,试下微软最近强推的MAUI
  • .Net Core 微服务之Consul(二)-集群搭建
  • .Net程序帮助文档制作
  • .net网站发布-允许更新此预编译站点
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • /run/containerd/containerd.sock connect: connection refused
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • @拔赤:Web前端开发十日谈
  • @取消转义