栈的应用----逆波兰(后缀)表达式
逆波兰表达式,它的语法规定,表达式必须以逆波兰表达式的方式给出。逆波兰表达式又叫做后缀表达式。
这个知识点在数据结构和编译原理这两门课程中都有介绍,下面是一些例子:
正常的表达式 逆波兰表达式
a+b ---> a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
a=1+3 ---> a=1,3 +
解释我们拿a+(b-c)*d ---> a,b,c,-,d,*,+为例子
首先是变量要按顺序并不参于入栈,+号入栈,ab,【入栈,-入栈(符号入栈后要看栈顶符号优先级,如果
比自己高或者等于自己就先让它们出站自己在入栈(的优先级很低 】,然后变量序列abc,)入栈【(优先级
很高他会匹配(把之间的符号压出】,序列编程abc-,然后*入栈*比+高所以不用出,序列变成abc-d,表达式
结束全部出栈,则有abc-d*+。
中缀变后缀:
将一个普通的中序表达式转换为逆波兰表达式的一般算法是:
(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。
(2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。
(3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。
(4)如果不是数字,该字符则是运算符,此时需比较优先关系。
做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运
符入栈。倘若不是的话,则将栈顶的运算符从栈中弹出,直到栈顶运算符的优先级低于当前运算符,将该字符入栈。
(5)重复上述操作(3)-(4)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的
简单算术表达式转化为逆波兰表示的简单算术表达式。
逆波兰(后缀)表达式求值算法:
(1)从左到右依次扫描语法单元的项目。
(2)如果扫描的项目是操作数,则将其压入操作数堆栈,并扫描下一个项目。
(3)如果扫描的项目是一个二元运算符,则对栈的顶上两个操作数执行该运算。
(4)如果扫描的项目是一个一元运算符,则对栈的最顶上操作数执行该运算。
(5)将运算结果重新压入堆栈。
(6)重复步骤2-5,堆栈中即为结果值。
用途
逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达
式。例如(a+b)*(c+d)转换为ab+cd+*
优点:
它的优势在于只用两种简单操作,入栈和出栈就可以搞定任何普通表达式的运算。其运算方式如下:
如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入
栈,最后当表达式扫描完后,栈里的就是结果。