文章目录

  • 简介
  • 栈的结构
  • 入栈和出栈
  • 栈的应用
    • 递归
    • 逆波兰算法
      • 后缀表达式
      • 后缀表达式计算
  • 结语

简介

栈是一种先进先出的数据结构。就如可连发的穿天猴那般,最开始放进去的火药肯定是最后才会射出的,而最后放进去的火药反而最先被射上天空。最先放进去的火药所处位置叫栈底,这个放入的操作为入栈。最后放进去的火药也就是最上面的火药叫栈顶。栈顶总是会被第一个取出的,取出的操作叫出栈

栈的结构

栈顶
2
1
栈底

1比2先放进去,但2会比1更早取出来,栈是从栈顶开始取数据的。

入栈和出栈

假如现有数据

1,2,3

我们要对其依次进行入栈操作,具体操作如下:

第一次入栈 第二次入栈 第三次入栈
3
2 2
1 1 1

出栈操作如下:

第一次出栈 第二次出栈 第三次出栈
取出3 取出2 取出1
2
1 1

由此可见最先进入的数据1反而是最后取出的,而最先进去的3第一次就被取出来了。这便是栈的基本存取过程。

栈的应用

递归

我们学习编程后第一个令人头疼的算法可能就是递归了,而递归正是运用的了栈先进先出的特性,现在我们要执行下列程序

class jc(int n){if(n<2){jc(n-1)}
System.out.println(n)
}

假定n=4,程序执行后会开辟一个栈。每执行一次jc()就会入栈,直到不满足条件才会停止,接着就会依次出栈并打印结果。

第一次执行jc(入栈) 第一次执行jc (入栈) 第三次次执行jc(入栈)
n=2,不满足条件结束执行打印
n=3,满足条件继续执行不打印 n=3
n=4,满足条件继续执行不打印 n=4 n=4

结束入栈后开始依次出栈,打印结果,程序结束。

第一次出栈 第二次出栈 第三次出栈
取出2,打印2 取出3,打印3 取出4,打印4
n=3
n=4 n=4

逆波兰算法

逆波兰算法也是栈的一种经典应用,它由两部分组成,后缀表达式转换和后缀表达式计算

后缀表达式

假定有公式(1+2)\×3 ,转换为后缀表达式等于12+3×,在讲转换过程前我们需要准备两个栈s1和s2。一个用来储存数值,另一个用来储存运算符。储存有几个规则

  1. 如果遇见数值,直接入数值栈s1
  2. 如果符号栈里面没有符号,直接入符号栈s2
  3. 如果符号内没有括号,则对比栈顶的符号,如果未入栈的符号优先级比栈顶的符号高,那么直接入s1数值栈,否者栈顶入s1数值栈,未入栈的符号直接入s2栈。
  4. 如果有“(”左括号,那么不用对比,遇见符号直接入符号栈s2。直到遇见“)”右括号,直接将括号内的符号入符号栈s2,删除左右括号。
  5. 如果公式遍历完毕,那么将s1中的符号栈直接

压入s2具体过程如下:
第一次遇见”(“,压入符号栈

s1 数值栈 s2 符号栈
(

第二次遇见”1“,压入数值栈

s1 数值栈 s2 符号栈
1 (

第三次遇见”+“,无需对比压入符号栈

s1 数值栈 s2 符号栈
+
1 (

第四次遇见”2“,压入数值栈

s1 数值栈 s2 符号栈
2 +
1 (

第五次遇见”)“,遇见右括号,将括号内符号取出

s1 数值栈 s2 符号栈
2 +
1 (

消除括号,符号转到s1

s1 数值栈 s2 符号栈
+
2
1

第六次遇见 " * “,压入符号栈

s1 数值栈 s2 符号栈
+
2
1 *

第七次遇见 " 3“,压入数值栈

s1 数值栈 s2 符号栈
3
+
2
1 *

公式遍历结束,最后将符号直接压入数值栈

s1 数值栈 s2 符号栈
*
3
+
2
1

得到结果:1 2 + 3 *

后缀表达式计算

后缀表达式的计算相对更简单,准备1个栈s1来储存数值。规则则是如果遇到数值就入栈,如果遇到符号,就取出两个值用该符号相乘,再把结果入栈。
假定现在用后缀表达式1 2 + 3 *具体计算过程如下
第一次遇见1,入栈

s1
1

第二次遇见2,入栈

s1
2
1

第三次遇见+,取出1和2,做加法运算再入栈

s1
3

第四次遇见3,入栈

s1
3
3

第五次遇见*,取出3和3,做乘法运算再入栈

s1
9

运算结束,原式(1+2)*3 结果为9

结语

栈也是一种比较基本的数据结构,但其应用极为广泛,比如递归,回溯等等。

什么是栈?栈的基本应用有哪些?相关推荐

  1. 队列实现栈 | 栈实现队列

    队列实现栈 | 栈实现队列 ⼀. ⽤栈实现队列 首先,队列的 API 如下: class MyQueue {/** 添加元素到队尾 */public void push(int x);/** 删除队头 ...

  2. 栈——栈的基本概念和基本操作

    文章目录 栈 栈的基本概念 栈的定义 栈的重要术语 栈的特点 栈的基本操作 创.销 增.删 查 判空 栈的数学性质 栈 本文我们初次学习栈,分为栈的基本概念和基本操作两个部分. 学习数据结构,我们的学 ...

  3. 顺序栈栈顶指针指向详析

    顺序栈栈顶指针指向详析 1.变长型(动态分配内存空间) #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 // 存储空 ...

  4. 判断顺序栈栈满的两种方式

    判断顺序栈栈满的两种方式

  5. Java #JVM(HotSpot) 运行时数据区 #程序计数器(PC寄存器)#虚拟机栈(栈帧:局部变量表、操作数栈……)#堆……

    目录 JVM中线程的说明 程序计数器(PC寄存器) 虚拟机栈 · 栈帧 ·· 局部变量表 ·· 操作数栈 ·· 动态链接 ·· 方法返回地址 ·· 本地方法栈 堆 · 查看堆的大小 · 堆的默认大小 ...

  6. 【Java 虚拟机原理】线程栈 | 栈帧 | 局部变量表 | 反汇编字节码文件 | Java 虚拟机指令手册 | 程序计数器

    文章目录 一.线程栈 二.栈帧 三.栈帧 - 局部变量表 四.反汇编字节码文件 五.Java 虚拟机指令手册 六.程序计数器 一.线程栈 装载 HelloWorld.class 字节码文件到 Java ...

  7. 队列化栈栈化队列(力扣)

    用队列实现栈 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push.top.pop 和 empty). 实现 MyStack 类: void push(int x ...

  8. JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈

    运行时数据区概述及线程概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JV ...

  9. [转载] java虚拟机 jvm 出入java栈 栈空间内存分配

    参考链接: Java虚拟机(JVM)堆栈区域 java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关.线程最基本的执行行为就是函数的调用.每次函数调 ...

  10. 顺序栈—栈顶指针的两种初始化

    采用顺序存储的栈称之为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针指示当前栈顶元素的位置. 下面给出两种栈顶指针定义的方式,讨论两种方式中在出栈.入栈代码上的不同: ...

最新文章

  1. 神策数据入选 Facebook 全球合作计划,助力出海客户拥抱全球化广告生态
  2. 关于iar加st-link,报出SWIM error [30200]错误,我自己处理的方法,usb重新插拔
  3. spyder matlab,将pycharm配置为matlab或者spyder的用法说明
  4. gdb常用命令及参考文档
  5. 武汉计算机985211大学有哪些,武汉985211大学有哪些 武汉985211大学有什么
  6. bzoj千题计划282:bzoj4517: [Sdoi2016]排列计数
  7. 项目学习类容,日期处理,SQL语句查询,hashtable的运用,R语言包的环境配置
  8. angular学习资源
  9. 利用机器学习实现微信小程序-加减大师自动答题
  10. mysql表内容_5、mysql表内容操作
  11. filter()“筛选”函数
  12. 计算机的格式刷,“excle怎样取消格式刷“电脑上格式刷怎么用excel2000
  13. ToolBar修改返回按钮图标,CollapsingToolbarLayout修改文字居中
  14. 如何屏蔽移动垃圾短信10658464
  15. 两种方法实现卸载apk应用程序
  16. Java使用当前日期加四位数实现每日自增单号工具类
  17. Python:Pycharm如何使用scrapy框架做爬虫?
  18. 学习Servlet2
  19. Hadoop3.2.1 【 YARN 】源码分析 : ApplicationMasterService 源码浅析 [ 一 ]
  20. 读 L. S. Stavrianos 之 《全球通史:从史前到21世纪》

热门文章

  1. C语言自制简单绘制时钟小程序
  2. PHP wampserver如何升级PHP到8.1.14
  3. 动态数组_栈的应用之十进制与十六进制的转换
  4. 单调队列java_浅谈单调队列优化dp
  5. 短域名有什么特点和优势?
  6. 世界如此险恶,你要内心强大
  7. 如何获取电脑名称_____机房收费系统
  8. Android基础入门教程——10.9 WallpaperManager(壁纸管理器)
  9. C#(仿QQ)聊天窗口
  10. 书单丨让人相见恨晚的12本科普书,启发力十足!