栈是限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出的线性表。栈的实现有三种方式:1.顺序方式;2.链式方式;3.逆波兰表达式。我们常用的为顺序方式,比如java源码的Stack类,逆波兰表达式是我们用四则运算时经常用到的,我们所说的四则运算比如:1+3x8-2/1 其实是一种中缀表达式,计算机要将这些转化为后缀表达式才能计算,而这中间就是用了栈的原理来转化的,包括整个加减乘除运算都离不开栈。综上可以看出,栈的应用非常广泛。
在java中的Stack其实是继承Vector类的,但是本身的方法函数却非常少,有兴趣的可以自行查看,并不难看出实现原理。前面我们提到过在用递归解决汉诺塔问题的时候其实就用到了栈的思想,汉诺塔的三根柱子摆放和移动圆盘可以看成一不停的入栈和出栈,根据先进后出的原则,不停的递归压栈入栈,最后整体移动圆盘的位置。
下面我们就用逆波兰表达式来说个例子:
标准四则运算表达式—中缀表达式
9+(3-1)X3+10/2 在经过此规则后:数字输出,运算符进栈,括号匹配出栈,比栈顶优先级低就出栈。就得到下面的
计算机采用—后缀表达式
9 3 1 - 3 * + 10 2 / + 20 在经过此规则计算后:1.数字入栈 2.符号就取2个进行计算,再入栈 。我们得到上下两个表达式结果都为20。