栈的应用 后缀表达式求值 后缀表达式与中缀表达式的转换

来源:互联网 发布:eclipse java项目结构 编辑:程序博客网 时间:2024/05/18 20:37

栈的应用

在计算机里面进行算数表达式的计算是通过栈来实现的。接下来给出算数表达式的两种表示方法,然后给出后缀表达式的求值算法,最后给出中缀表达式转换为后缀表达式的算法。

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

算数表达式:算数表达式一般由三部分组成,1操作数、2运算符、3改变运算次序的圆括号。
中缀表达式:是将运算符放在两个操作数之间的表达式,也是我们生活、学习过程中常用的算数表达式。
后缀表达式:是将运算符放在两个操作数之后的表达式。
中缀表达式是我们接触最多的表示,也是我们现在最容易理解的表达式,但由于中缀表达式的规则较多,计算机计算起来比较复杂,所以我们可以将中缀表达式转化为后缀表达式,即逆波兰式。
中缀表达式:
(1)3/5+6;
(2)16-9*(4+3);
(3)2*(x+y)/(1-x);
对应的后缀表达式:
(1)3 5 / 6 +;
(2)16 9 4 3 + * - ;
(3)2 x y + * 1 X - /;
中缀表达式转化为后缀表达式的规则是:把每一个运算符都移到它们两个运算对象的后面,然后删除所有的圆括号。

二、后缀表达式的求值算法

后缀表达式求值的基本思路是:把后缀表达式定义成一个字符串,每次从中读取到一个字符时,若它是一个运算符,则表明它的两个操作数已经在栈中,把它们弹出出来进行相应的运算就好,再把计算的结果压入栈中。如果读入的字符不是一个运算符那么读入的字符是操作数的最高位数字,把后面的连续若干个字符(一直到出现空格,假定以空格作为操作数与操作数,操作数与运算符之间的间隔)转化成一个整数,再把它压入栈中。将字符串的每一个字符这样处理,一直到遇到结束符@(假定@为字符串的结束符)。

三、后缀表达式与中缀表达式的转换算法

把中缀表达式转化为后缀表达式的基本思路:s1字符串用来存放中缀表达式(假定字符串结束符为@),s2字符串用来保存后缀表达式,由于中缀表达式转化为后缀表达时,运算符由两个操作数的中间放到两个操作数的后面,所以需要一个运算符栈来保存中缀表达式式中暂时不能放入后缀表达式的运算符号,等到运算符对应的两个操作数都进入后缀表达式之后再将该运算符放入后缀表达式,在该运算符栈中放入一个@,让@有最低的运算符优先级。
从头到尾扫描中缀表达式s1中的每一个字符。
1、若遇到的是空格则不需要进行进行处理
2、若遇到的是小数点或数字,则直接写进后缀表达式s2中。
3、若遇到的是左括号,则把它压入运算符栈中,等到以它开始的括号内的表达式转换完毕之后再出栈。
4、若遇到的是右括号,则表明括号内的中缀表达式已经全都扫描完毕,把从栈底一直到到左括号的运算符弹出来放进后缀表达式s2。
5、若遇到的是运算符,当运算符的优先级大与栈顶元素的优先级时,表明该运算符的后一个运算对象还没有扫描到后缀表达式s2中,等到它后一个运算对象从S1中扫描出来并且放入S2中,再将它从运算符栈弹出来写入S2中。当运算符的优先级等于小于栈顶运算符优先级时,表明该运算符的两个运算对象已经写入了S2中,那么应该将栈顶运算符弹出写入S2中,对于新的栈顶运算符将仍进行比较和处理,一直到从S1扫描出的运算符优先级大于栈顶元素的运算符优先级为止。
按照以上过程扫描到中缀表达式字符串S1结束符@时,把运算符栈中剩余的运算符全部弹入后缀表达式S2中,再向S2中写入字符串结束符@。这样S2就得到了由S1中缀表达式转换而来的后缀表达式。

阅读全文
1 0
原创粉丝点击