栈与队列之栈的应用四则运算表达式求值
栈在四则运算表达式求值的应用为逆波兰表达式(后缀表达式)
普通算式(中缀表达式):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:相关代码(待续)