(六)数据结构-栈在表达式求值中的应用

表达式求值事程序设计语言编译中一个最基本的问题,他的实现是栈应用中i有一个典型范例。
中缀表达式不仅以来运算符的优先级,而且还要处理括号
后缀表达式已经考虑了运算符的优先级,没有括号,只有操作数和运算符

在这里插入图片描述

在这里插入图片描述

一、中缀表达式转后缀表达式

1.1中转后表达式的方法

  1. 遇到操作数:直接输出
  2. 遇到界限符:遇到( 直接入栈,直到遇到),则依次弹出栈内运算符并加入到后缀表达式中,直到弹出(为止,
    注意:(不输出

3.遇到运算符:依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若碰到(或栈空则停止,之后再把当前运算符入栈。

1.2实例1

在这里插入图片描述

  1. 9是数字直接输出
    此时后缀表达式为9

  2. +和(是符号进栈

  3. 3是数字直接输出
    此时后缀表达式为9 3

  4. -和是符号进栈

  5. 1是数字直接输出
    此时后缀表达式为9 3 1
    此时栈中元素有从栈底元素依次向栈顶表示 + ( -

  6. )是右括号,匹配左括号,所以栈顶符号依次出栈,直到(,但是(不输出
    此时后缀表达式为9 3 1 -
    此时栈中元素有从栈底元素依次向栈顶表示 +

  7. *和是符号进栈

  8. 3是数字直接输出
    此时后缀表达式为9 3 1 - 3
    此时栈中元素有从栈底元素依次向栈顶表示 + *

  9. 此时中缀表达式走到+号了,+是符号,的优先级大于当前+,所以出栈(并且栈中符号优先级都不小于当前+,所以全部出栈,意思就是此时在栈底元素的+也要出栈),接着+入栈
    此时后缀表达式为9 3 1 - 3 * +
    此时栈中元素有从栈底元素依次向栈顶表示 + (此时+是最新入栈的+)

  10. 10是数字直接输出
    此时后缀表达式为9 3 1 - 3 * +

  11. /是符号直接进栈

  12. 2是数字直接输出
    此时后缀表达式为9 3 1 - 3 * +
    13.最后将栈中的符号依次输出

1.3实例2

将前缀表达式a/b+(c*d-e*f)/g转化为等价的后缀表达式

  • 步骤1:按照运算符优先级对所有的运算单位加括号
(a/b)+(((c*d)-(e*f)) / g))
  • 步骤2:转换为前缀或后缀表达式
  • 这边我们转换为后缀表达式:把运算符号移动到对应的括号后面
((ab)/(((cd)*(ef)*)-g)/)+
  • 步骤3:把括号去掉
ab/cd*ef*-g/+

二、后缀表达式的计算

2.1方法(从左边到右扫描)

遇到数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果

2.2实例

在这里插入图片描述

  1. 9 3 1依次进栈
  2. 遇到-,那么栈顶元素1 和 3出栈,先出栈的在右操作数,为3-1=2
  3. 再将结果2进栈
  4. 3进栈
  5. 遇到那么栈顶元素3 和 2出栈,表达式为23=6
  6. 再将结果6进栈
  7. 遇到+那么栈顶元素9 和 6出栈,表达式9+6=15
  8. 再将结果15进栈
  9. 再将表达式中的 10 2进栈
    此时栈中元素 从栈底元素依次向栈顶:15 10 2
  10. 遇到/那么栈顶元素10和 2出栈,表达式10/2=5
  11. 再将结果中的5进栈
    此时栈中元素 从栈底元素依次向栈顶:15 5
  12. 遇到+那么栈顶元素5 和 15出栈,表达式15+5=20

所以结果为20

三、前缀表达式的计算

3.1方法(从右边到左边扫描)

方法与后缀表达式类似

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值