栈的应用-处理四则运算-后缀表达式
什么是后缀表达式,正常的四则运算表达式,如:
9 + (3 - 1) * 3 + 10 / 2
这样的四则运算表达式称为中缀表达式,因为运算符号都在两个数字的中间。后缀表达式则是:
9 3 1 - 3 * + 10 2 / +
运算符号在将要运算的数字后面。
规则:从左到右遍历表达式的每个数字和运算符,遇到数字就进栈,遇到符号,就将处于栈顶的两个数字出栈,进行运算,将运算结果进栈,直到最终获得结果。
比如上面表达式中,
- 1.先将 9 3 1 进栈,接下来是减号 - ,则将栈中的 1 出栈作为减数,3出栈作为被减数,并运算 3 - 1 得到 2 ,再将 2 进栈;
- 2.接下来是 3 进栈,下一步 * 进栈,则此时 3 出栈,2 出栈,进行乘法运算,得到6;
- 3. .……
- 4.以此方法,直到计算结束。
后缀表达式可以很顺利地解决计算问题,问题是怎么将中缀表达式,转化成后缀表达式?
规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,成为后缀表达式的一部分;若是符号,就判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号(乘除优先加减),则栈顶元素依次出栈并输出,并将当前符号进栈,直到最终输出后缀表达式为止。
以上述表达式为例:
- 1.初始化空栈,用来对符号进出栈使用;
- 2.第一个数字9,输出9,后面是符号 + ,进栈;
- 3.第三个字符是( ,进栈;
- 4.第四个字符是数字 3 ,输出 ,现在总表达式为 9 3 ,接着是减号 - ,进栈;
- 5.接下来是数字 1 ,输出,现在表达式是 9 3 1 ,后面是符号 ) ,此时,需要匹配前面的 ( ,因此栈顶依次出栈,直到 ( 出栈为止 。 现在表达式为 9 3 1 - ;
- 6. 接着是数字 3 ,输出,表达式变为 9 3 1 - 3 ……
- 7. ……
- 8. 最后一个数字 2 ,输出,总表达式为 9 3 1 - 3 * + 10 2 ;
- 10. 到最后,将栈中符号全部出栈并输出,最终表达式为 9 3 1 - 3 * + 10 2 / +
总结:
从上述推导中会发现,要让计算机具有处理中缀表达式的能力,最重要的就是两步:
1.将中缀表达式转化为后缀表达式;
2.将后缀表达式进行运算得出结果。
整个过程充分运用了栈的后进先出特性。