什么是栈?栈的基本应用有哪些?
文章目录
- 简介
- 栈的结构
- 入栈和出栈
- 栈的应用
- 递归
- 逆波兰算法
- 后缀表达式
- 后缀表达式计算
- 结语
简介
栈是一种先进先出的数据结构。就如可连发的穿天猴那般,最开始放进去的火药肯定是最后才会射出的,而最后放进去的火药反而最先被射上天空。最先放进去的火药所处位置叫栈底,这个放入的操作为入栈。最后放进去的火药也就是最上面的火药叫栈顶。栈顶总是会被第一个取出的,取出的操作叫出栈。
栈的结构
栈顶 |
---|
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。一个用来储存数值,另一个用来储存运算符。储存有几个规则
- 如果遇见数值,直接入数值栈s1
- 如果符号栈里面没有符号,直接入符号栈s2
- 如果符号内没有括号,则对比栈顶的符号,如果未入栈的符号优先级比栈顶的符号高,那么直接入s1数值栈,否者栈顶入s1数值栈,未入栈的符号直接入s2栈。
- 如果有“(”左括号,那么不用对比,遇见符号直接入符号栈s2。直到遇见“)”右括号,直接将括号内的符号入符号栈s2,删除左右括号。
- 如果公式遍历完毕,那么将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
结语
栈也是一种比较基本的数据结构,但其应用极为广泛,比如递归,回溯等等。
什么是栈?栈的基本应用有哪些?相关推荐
- 队列实现栈 | 栈实现队列
队列实现栈 | 栈实现队列 ⼀. ⽤栈实现队列 首先,队列的 API 如下: class MyQueue {/** 添加元素到队尾 */public void push(int x);/** 删除队头 ...
- 栈——栈的基本概念和基本操作
文章目录 栈 栈的基本概念 栈的定义 栈的重要术语 栈的特点 栈的基本操作 创.销 增.删 查 判空 栈的数学性质 栈 本文我们初次学习栈,分为栈的基本概念和基本操作两个部分. 学习数据结构,我们的学 ...
- 顺序栈栈顶指针指向详析
顺序栈栈顶指针指向详析 1.变长型(动态分配内存空间) #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 // 存储空 ...
- 判断顺序栈栈满的两种方式
判断顺序栈栈满的两种方式
- Java #JVM(HotSpot) 运行时数据区 #程序计数器(PC寄存器)#虚拟机栈(栈帧:局部变量表、操作数栈……)#堆……
目录 JVM中线程的说明 程序计数器(PC寄存器) 虚拟机栈 · 栈帧 ·· 局部变量表 ·· 操作数栈 ·· 动态链接 ·· 方法返回地址 ·· 本地方法栈 堆 · 查看堆的大小 · 堆的默认大小 ...
- 【Java 虚拟机原理】线程栈 | 栈帧 | 局部变量表 | 反汇编字节码文件 | Java 虚拟机指令手册 | 程序计数器
文章目录 一.线程栈 二.栈帧 三.栈帧 - 局部变量表 四.反汇编字节码文件 五.Java 虚拟机指令手册 六.程序计数器 一.线程栈 装载 HelloWorld.class 字节码文件到 Java ...
- 队列化栈栈化队列(力扣)
用队列实现栈 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push.top.pop 和 empty). 实现 MyStack 类: void push(int x ...
- JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈
运行时数据区概述及线程概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JV ...
- [转载] java虚拟机 jvm 出入java栈 栈空间内存分配
参考链接: Java虚拟机(JVM)堆栈区域 java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关.线程最基本的执行行为就是函数的调用.每次函数调 ...
- 顺序栈—栈顶指针的两种初始化
采用顺序存储的栈称之为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针指示当前栈顶元素的位置. 下面给出两种栈顶指针定义的方式,讨论两种方式中在出栈.入栈代码上的不同: ...
最新文章
- 神策数据入选 Facebook 全球合作计划,助力出海客户拥抱全球化广告生态
- 关于iar加st-link,报出SWIM error [30200]错误,我自己处理的方法,usb重新插拔
- spyder matlab,将pycharm配置为matlab或者spyder的用法说明
- gdb常用命令及参考文档
- 武汉计算机985211大学有哪些,武汉985211大学有哪些 武汉985211大学有什么
- bzoj千题计划282:bzoj4517: [Sdoi2016]排列计数
- 项目学习类容,日期处理,SQL语句查询,hashtable的运用,R语言包的环境配置
- angular学习资源
- 利用机器学习实现微信小程序-加减大师自动答题
- mysql表内容_5、mysql表内容操作
- filter()“筛选”函数
- 计算机的格式刷,“excle怎样取消格式刷“电脑上格式刷怎么用excel2000
- ToolBar修改返回按钮图标,CollapsingToolbarLayout修改文字居中
- 如何屏蔽移动垃圾短信10658464
- 两种方法实现卸载apk应用程序
- Java使用当前日期加四位数实现每日自增单号工具类
- Python:Pycharm如何使用scrapy框架做爬虫?
- 学习Servlet2
- Hadoop3.2.1 【 YARN 】源码分析 : ApplicationMasterService 源码浅析 [ 一 ]
- 读 L. S. Stavrianos 之 《全球通史:从史前到21世纪》
热门文章
- C语言自制简单绘制时钟小程序
- PHP wampserver如何升级PHP到8.1.14
- 动态数组_栈的应用之十进制与十六进制的转换
- 单调队列java_浅谈单调队列优化dp
- 短域名有什么特点和优势?
- 世界如此险恶,你要内心强大
- 如何获取电脑名称_____机房收费系统
- Android基础入门教程——10.9 WallpaperManager(壁纸管理器)
- C#(仿QQ)聊天窗口
- 书单丨让人相见恨晚的12本科普书,启发力十足!