目录
本章重点内容
1)堆栈与队列的基本概念与基本操作
2)堆栈与队列的顺序存储结构与链式存储结构的构造原理
3)在不同存储结构的基础上对堆栈与队列实施插入语删除等操作的算法设计
4)堆栈与队列在解决实际问题中的应用
1.堆栈
1.1.堆栈的定义
堆栈(stack)简称栈,它是一种允许在表的一段进行插入和删除操作的线性表。
允许操作的一端称为栈顶,另一端称为栈底。
进栈和出栈遵循“后进先出(Last In First Out, LIFO)”的原则进行,正是由于这个特点,也成堆栈为后进先出表或下推表。
1.2.堆栈的基本操作
1)初始化一个堆栈
2)测试堆栈是否为空
3)在堆栈的顶端插入一个新的数据元素,简称“进栈”或者“入栈”
4)删除堆栈的顶端元素,简称“出栈”或者“退栈”
5)取当前栈顶元素,注:该操作不改变指针位置
。
1.3.堆栈的顺序存储结构
采用顺序存储结构的堆栈简称为顺序堆栈。
1.3.1.顺序堆栈的构造
堆栈的顺序存储结构可以利用一个具有M个元素的数组STACK[0, M-1]来描述。STACK是堆栈的名字,数组的上界M表示堆栈的最大容量,同时定义一个整型变量top作为堆栈的栈顶指针,它指出某一时刻堆栈栈顶元素的位置。
STACK[0]代表进入堆栈的第1个元素(当没进行删除操作时)
STACK[i]代表进入堆栈的第i+1个元素()
STACK[top]代表当前栈顶元素。同时定义,堆栈为空栈时,top=-1
。
1.3.2.堆栈溢出问题
栈满时,进行入栈操作则会产生溢出,称这种现象为“上溢”。
栈空时,进行出栈操作泽慧产生溢出,称这种现象为“下溢”
1.4.堆栈的链式存储结构
采用链式存储结构的堆栈简称为链栈。
1.4.1.链式堆栈的构造
链接堆栈就是采用一个线性链表实现一个堆栈结构。栈中每一个元素用一个链结点表示,同时设置一个指针变量(top)指出当前栈顶元素所在链结点的存储位置,当堆栈为空时,top为NULL。
注:采用线性链表表示的堆栈,链表不必设置头结点,链表的第一个链结点就是栈顶元素所在的链结点,最先进入堆栈的元素一定再链表末尾的那个链结点中。即:对链接堆栈的操作都是在链表的表头位置进行的。如下图所示:a先进栈,b再进栈,c再进栈。
题目: 入栈顺序为a,b,c,d,则出栈顺序可能为()
A. d, c, b, a
B. c, b, d, a
C. b, d, a, c
D. a, d, c, b
答案: ABD
解析: 根据出栈的第一个元素,确定此时栈内的元素,再根据入栈出栈顺序选择合适的序列方案。
A选项如图1所示,根据a进,b进,c进,d进,d出,c出,b出,a出。进栈顺序满足abcd,出栈顺序满足dcba,故A正确。
B选项如图2所示,a进,b进,c进,c出,b出,d进,d出,a出。进栈顺序满足abcd,出栈顺序满足cbda,故B正确。
D选项如图3所示,a进,a出,b进,c进,d进,d出,c出,b出。进栈顺序满足abcd,出栈顺序满足adcb,故D正确。