数据结构(7)----栈与队列之栈的应用四则运算表达式求值

栈与队列之栈的应用四则运算表达式求值

栈在四则运算表达式求值的应用为逆波兰表达式(后缀表达式)

普通算式(中缀表达式):9 + (3 - 1) * 3 + 10 / 2        ---(1)

逆波兰表达式(后缀表达式):9 3 1 - 3 * + 10 2 / +        ---(2)

1:逆波兰表达式的计算规则

  从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就将处于栈顶的两个数字出栈,进行运算,再把运算结果进栈,一直到最终获得结果。接下来我们以(2)式为例:

  3个数字进栈:9 3 1

      第4个为-,把1和3取出做减法3-1=2,再把2进栈:9 2

  第5个为3,进栈:9 3 2

  第6个为*,2,3出栈,3*2=6,把6进栈:9 6

  第7个为+,6,9出栈,9+6=15,15进栈:15

  第8,9个为10,2,进栈:15 10 2

  第10个为/,2,10出栈,10/2=5,5进栈:15 5

  第11个为+,5,15出栈,15+5=20,20进栈:20

  20即为所求

2:中缀表达式转后缀表达式(逆波兰表达式)

  规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分,若是符号,则判断其栈顶符号的优先级,若是右括号或者优先级低于栈顶符号的则栈顶元素一次出栈并输出,并将当前符号进栈,知道最终输出后缀表达式为止。

以表达式:9 + (3 - 1) * 3 + 10 / 2  为例:

  1)第1个数字是9,栈:空;输出:9

  2)第2个是+,进栈,栈:+;输出:9

  3)第3个是(,进栈,栈:+ (;输出:9

  4)第4个是3,输出3,栈:+ (;输出:9 3

  5)第5个是-,-进栈,栈:+( -;输出:9 3

  6)第6个是1,1输出,栈:+( -;输出:9 3 1

  7)第7个是),栈输出,直到匹配到左括号,栈:+;输出:9 3 1 -

  8)第8 个是*,*进栈,栈:+ *;输出:9 3 1 - 

  9)第9个是3,3输出,栈:+ *;输出:9 3 1 - 3

  10)第10个是+,栈内大于或等于当前符号优先级的符号输出,然后当前符号进栈,栈:+;输出:9 3 1 - 3 * +

  11)第11个是10,10输出,栈:+;输出:9 3 1 - 3 * + 10

  12)第12个是/,/进栈,栈:+ /;输出:9 3 1 - 3 * + 10 

  13)第13个是2,2 输出,栈:+;输出:9 3 1 - 3 * + 10 2

  14)最后把栈内符号输出:9 3 1 - 3 * + 10 2 / +

  9 3 1 - 3 * + 10 2 / + 即为所求

3:相关代码(待续)

转载于:https://www.cnblogs.com/EmperLin/p/6545051.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值