栈
1.定义及特性
栈(Stack)是限制在表的一端进行插入和删除运算的线性表,通常称插入、删除的这一端为栈顶(Top),另一端为栈底(Bottom)。当表中没有元素时称为空栈。
假设栈S=(a1,a2,a3,…an),则a1称为栈底元素,an为栈顶元素。栈中元素按a1,a2,a3,…an的次序进栈,退栈的第一个元素应为栈顶元素。换句话说,栈的修改是按后进先出的原则进行的。因此,栈称为后进先出表(LIFO)(LIFO, Last In First Out)
1. 定义
限定只能在表的一端进行插入和删除运算的线性表。
2. 逻辑结构
与线性表相同,仍为一对一( 1:1)关系。
3. 存储结构
用顺序栈或链栈存储均可,但以顺序栈更常见
4. 操作规则
只能在栈顶运算,且访问结点时依照后进先出(LIFO)或先进后出(FILO)的原则。
5. 实现方式
关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的存储结构有别而不同。
基本操作有:建栈、判断栈满或栈空、入栈、出栈、读栈顶元素值,等等。
Q1:堆栈是什么?它与一般线性表有什么不同?
堆栈是一种特殊的线性表,它只能在表的一端(即栈顶)进行插入和删除运算。
与一般线性表的区别:仅在于操作规则不同。
一般线性表 | 栈 | |
---|---|---|
逻辑结构 | 1:1 | 1:1 |
存储结构: | 顺序表、链表 | 顺序栈、链栈 |
运算规则 | 随机存取 | 运算规则:后进先出 |
后进先出:
“进”=插入=压入=Push(an+1)
“出”=删除=弹出=Pop(an)
Q2:顺序表和顺序栈的操作有何区别?
栈不存在的条件: base=NULL;
栈为空 的条件 : base=top;
栈满的条件 : top-base=stacksize;
Q3:什么叫“向上生成”的栈? “向下生成”又是何意?
若入栈动作使地址向高端增长,称为“向上生成”的栈;
若入栈动作使地址向低端增长,称为“向下生成”的栈;
对于向上生成的栈:
入栈口诀:堆栈指针top “先压后加” : S[top++]=an+1
出栈口诀:堆栈指针top “先减后弹” : e=S[–top]
Q4:为什么要设计栈?它有什么独特用途?
- 调用函数或子程序非它莫属;
- 递归运算的有力工具;
- 用于保护现场和恢复现场;
- 简化了程序设计的问题。