栈的应用(四则运算后缀表达式)

    后缀(逆波兰)表示法:一种不需要括号的后缀表示法,所有运算符都是在要运算数字的后面,比如后缀表达式 9 3 1 - 3 * + 10 2 / +

就是中缀表达式 9 + (3 - 1) × 3 + 10 / 2

 

后缀表达式可以用栈来实现

 

规则:创建一个空栈,把后缀表达式依次进栈,要求遇到数字就进栈,遇到符号就将栈顶的两个数字依次出栈,进行运算后,运算结果进栈,直到获得最终结果。

 

画图举例:9 3 1 - 3 * + 10 2 / + 

第一步:9 3 1 依次进栈

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 第二步:遇到 ' - ' ,1出栈作为减数,3作为被减数,运算 3 - 1,得到 2,将2进栈。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 第三步:3进栈

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 第四步:遇到 ' * ',3和2依次出栈,运算2*3得6,将6进栈。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 第五步:遇到 ' + ',6和9依次出栈,运算9+6=15,将15进栈。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 第六步:10和2依次进栈。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 第七步:遇到 ' / ',2和10依次出栈,运算10/2=5,将5进栈。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 第八步:遇到 ' + ',5和15依次出栈,运算15+5=20,将20进栈。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

     第九步:最终结果出栈,栈变空。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 

    最后再来验证一下9 + (3 - 1) × 3 + 10 / 2

=9+6+5=20。运算正确!

 

    中缀表达式转化为后缀表达式的规则也可以使用栈来实现。

    例如9 + (3 - 1) × 3 + 10 / 2,

    规则如下:

    从左到右遍历中缀表达式,遇到数字输出数字,遇到运算符,若该运算符的优先级比栈顶的运算符优先级低,则栈顶元素出栈并输出,然后该元素进栈,否则该运算符直接进栈(乘除大于加减)。或者遇到右括号,则从栈顶元素依次出栈,直到遇到左括号(左括号也出栈),但括号只出栈,不输出。

第一步:输出9,+ 进栈。 9

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 第二步:( 进栈,输出3。  9 3

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 第三步:' - ' 进栈,输出1。9 3 1

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 第四步:- 出栈,)进栈,输出 - ,()也出栈,不输出。 9 3 1 -

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 第五步:*进栈,输出3。 9 3 1 - 3

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 第六步:*出栈,+出栈,+进栈,输出10。

+优先级最低。

 9 3 1 - 3 * + 10

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16 

 第七步:/ 进栈,输出2。9 3 1 - 3 * + 10 2

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 

第八步:/和+依次出栈。9 3 1 - 3 * + 10 2 / +

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pel5L2c5pyI5oGv,size_20,color_FFFFFF,t_70,g_se,x_16

 

    总结:想让计算机具有处理中缀表达式的能力,最重要的有两步:

1.将中缀表达式转换为后缀表达式

(栈用来进出运算符)

 

2.将后缀表达式转换为中缀表达式

(栈用来进出数字)

 

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值