栈 stack
栈是一种操作受限的顺序表。
栈中的元素只能先进后出,即FILO(First In Last Out)
栈是只能在表的一端进行插入和删除数据元素的线性表,允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。
不含数据元素的表称为空栈。
栈的运算
- 初始化。
- 清空栈。
- 读取栈顶元素。
- 检查栈是否为空。
- 入栈。
- 出栈。
顺序存储结构
采用顺序存储方式的栈称为顺序栈。
与线性表一样,栈也可以采用顺序存储方式。将栈底到栈顶的数据元素依次存放到一组连续的存储单元中,并用一个变量top指示栈顶元素的位置。习惯上,将变量top称为栈顶指针。
当栈中不存在任何元素时,栈顶指针不指向表中的任何位置。
链式存储结构
使用链式存储结构存储的栈简称链栈。
栈也可以采用链式存储结构。在链式存储方式下,栈中的数据元素存储在一组任意(连续或者不连续)的存储单元中,用指向数据元素存储位置的指针来表示数据元素入栈的先后关系。用一个指针top指向栈顶元素,指针top称为栈顶指针。
如有一组数据元素a1,a2,,an按顺序入栈,则链栈的存储结构如图所示。
栈的应用
在计算机科学领域,栈具有广泛的应用。常常利用栈来求解表达式的值、递归实现等问题。
表达式求值
在计算机科学领域中,常用两种形式来表示算术表达式。
第一种称为中缀表达式,用算术运算符和括号把运算对象连接起来,双目运算符位于两个运算对象之间,如(a+b)*c
第二种称为后缀表达式,也称逆波兰表达式,由波兰科学家卢卡谢维奇(Lukasiewicz)提出,把运算符放在参与该运算的两个运算对象
之后,如ab+c*。
可以采用如下规则把中缀表达式转换为后缀表达式。
(1)把中缀表达式中的所有运算符置于它的两个运算对象之后。
(2)去掉表达式中的所有括号。
计算中缀表达式时,需要确定各运算符的优先级,先计算优先级高的运算符。对于相同优先级的运算符,则按照从左到右的顺序计算。
与中缀表达式相反,计算后缀表达式时,无需考虑运算符的优先级,只需要以从左到右按照表达式出现的先后次序进行计算即可。
栈与递归
递归是一种重要的程序设计技术。很多问题可以很方便、简洁地用递归程序解决。
递归的定义:如果一个对象的组成部分的定义与它本身相同,则称该对象是递归的;如果一个过程执行时直接或者间接地调用自己,则称这个过程是递归的。
满足如下条件的问题可以用递归方法求解:
(1)该问题可以被转化为一个或多个较简单的新问题,新问题与原问题的求解方法相同,只是规模不同。
(2)有一个结束递归的条件,称为递归边界,不能出现无穷递归。