栈的经典实用

在JVM的运行时数据区包括:方法区、虚拟机栈、本地方法栈、堆、程序计数器。而虚拟机栈描述的是JAVA方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

对于开头提到的信息相信每个对JVM有了解的人都明白,但是刚看到栈帧中的操作数栈,并不知道是做什么的?我不知道大家有没有这样的经历,知道有这么一个操作数栈,但是具体是做什么的,运行过程是什么样儿的,并不是很清楚

下面我们看两个表达式

波兰表达式法:标准四则运算表达式, 也称 中缀表达式
就是我们从小学习的四则运算的表达式。
例1:9+(3-1)*3+10/2 = ?

逆波兰表达式法 - 后缀表达式
上述例1,转为后缀表达式为:9 3 1 - 3 * + 10 2 / +

我们在计算例1的中缀表达式时,我们可以计算出结果是20,但是这样的描述,计算机无法实别,而计算机通过栈结构+后缀表达式,可以压栈出栈,得出表达式的结果。

操作数栈的执行过程

数字入栈,操作符,从栈中弹出操作数,计算结果,结果入栈

第一步: 将后缀表达式从头开始依次压入栈


图片.png

第二步:当遇到操作符“-”时,从栈中弹出两个操作数,第一个弹出的作为减数,第二个作为被减数,进行运算,计算出结果为2

图片.png

第三步:将计算出的结果入栈:

图片.png

第四步:将3压入栈中


图片.png

第五步:处理"*"
从栈中弹出3 作为乘数 弹出2作为被乘数,并将结果6压入栈中,结果如下图

图片.png

第六步:处理"+"
从栈中弹出6作为加数弹出9作为被加数,计算 9+6=15,将结果15入栈


图片.png

第七步:10入栈,2 入栈


图片.png

第八步:处理 "/"
弹出操作数2作为除数,10作为被除数,10/2=5,将结果5入栈


图片.png

第九步:处理"+"
弹出操作数5作为加数,操作数15作为被加数,15+5=20,20即为结果

上述是整个操作数栈的执行过程。

讲到这里,大家应该能明白JVM栈中的操作数栈的具体作用和执行过程了,但是有一个问题还没有解决,中缀表达式是怎么转换后后缀表达式?接下来我们看一下转换过程,其实在中缀转后缀的过程中,使用到的数据结构也是栈。

转换规则

- 1、数字输出
- 2、运算符进栈
- 3、括号匹配出栈
- 4、如栈顶优先级高,则输出后一位数字,再出栈操作符

转换过程

为了方便读者观看,我们把要转换的中缀表达式,在这里再显示一次,中缀表达式:9+(3-1)3+10/2
第1步:根据上面的规则,数字9、3、1、输出,操作符+(-依次进栈,可以得到,栈中的内容如下图:

图片.png

第2步:这里需要注意一下,因为规则中,扩号匹配出栈,怎么理解呢,就是把左号到当前栈顶的符号依次弹出栈,加到输出结果中,
图片.png

第3步:处理"
",这里要注意一个,这个符合规则 的第4条,“”优先级要比现栈顶符号优先级高,所以先输出后面的数字3,然后将*入栈,再依次将操作符出栈。

图片.png

第4步: "+ "入栈,输出10


图片.png

第5步:这时候和第三步情况一下,"/"优先级高于栈顶操作符“+”,所以先输出“/”后面的数字“2”,将"/"入栈, 依次将栈中操作符出栈,并输出


图片.png

最终结果就是我们所需要的后缀表达式:
图片.png

使用java代码模拟jvm操作数栈的计算过程

相关代码传送门:
https://github.com/18921569386/datastructure/blob/master/datastructure-base/src/main/java/com/albk/datastructure/base/statck/ext/OperateStack.java

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容