大纲要求
1.栈和队列的基本概念;
2.栈和队列的顺序存储结构;
3.栈和队列的链式存储结构;
4.栈和队列的应用;
5.特殊矩阵的压缩存储;
(一般为小题,自主命题可能会有简答题,比较简单,很少独立出算法设计题)
(自主命题对数组有要求)
本章考点
1.栈的类型定义
2.栈的应用举例
3.栈类型的实现
4.队列的类型定义
5.队列的实现
6.数组的类型定义
7.数组的顺序表示和实现
8.特殊矩阵的压缩存储
栈和队列的特殊的线性表,只能在表端增删的线性表;
线性表可在整个表增删
栈只能在栈顶增删(先进后出)
队列只能在首增尾删(先进先出)
一、栈的类型定义
ADT stack
{
Data object:
D = {ai|i = 1,2,3,4....,n>=0};
Data relation:
R1 = {<ai-1,ai>|i = 1,2,3,4....,n>=0};
约定an为栈顶,a1为栈底;
Basic operation:
}ADT Stack
Basic operation:
初始化initstack(&S)
销毁destroy(&S)
栈长stackLength(s)
是否为空Empty(S)
获取栈顶gettop(s, &e)要求栈不为空
清空栈clear(&s)要求栈不为空
压栈push(&s,e)初始条件要求栈存在,在栈顶添加一个元素;
出栈pop(&s,e)初始条件要求栈不为空,删除栈顶元素;
二、栈的应用举例
1.数制转换
利用栈的操作特点,区别高低位存储问题
入栈顺序:4-0-5-2
出栈顺序:2-5-0-4
具体操作:
2.括号匹配的检验
算法设计思想:
1)出现左括号,压栈;
2)出现右括号,判断栈是否为空,不为空与栈顶元素匹配,匹配成功栈顶元素出栈继续匹配,若不匹配则匹配失败;
3)表达式结束,栈空则匹配成功,否则失败;
具体实现:
3.行编辑程序问题
分析:缓冲区为栈
具体实现:
4.表达式求值
结论:
1)操作数之间的相对次序不变;
2)运算符的相对次序不变;
3)中缀丢失括弧信息,会发生错误;
4)前缀的运算规则:
连续出现的两个操作数和在它们之前并且紧靠它们的运算符构成一个最小的表达式;
5)后缀的运算规则:
运算符在式中出现的顺序恰为表达式的运算顺序
每个运算符和之前紧靠他的操作数构成一个最小的表达式
如何从后缀式求值:
先找运算符再找操作数;
数字压栈,遇到符号出栈两个再将结果压栈;
如何将一般的表达式转化为后缀式:
设立暂存运算符的栈;
设表达式的结束符为“#”存在栈底;
遇到操作符比较与栈顶运算符优先级,大,压栈,小发送给后缀式;
“(”对他之前后的运算符起隔离作用,“)”视为响应左括号的结束;
5.实现递归
调用自身的函数;
最后调用的函数最先结束,利用栈先进后出的特性即可实现;
三、栈的实现
1.顺序栈
类似于线性表的顺序映像实现,指向表尾的指针可以做栈顶指针;
基本操作:
1)初始化
2)压栈
3)出栈
2.链栈
类似于不带头结点的单链表;
四、队列类型的定义
基本操作:
链队列-链式映像
循环队列-队列的顺序存储的形式(也可以用链式存储实现,不等于循环链表):
循环队列中需要注意的几点:
a.如果对头等于队尾,则为空;
b.如果队尾位置加以对队列容量取余等于对头位置,则队满;
c.无论是对循环队列进行插入还是删除,均可能涉及头或尾指针的调整(模运算加一取余)
如何理解(Q.rear-Q.front + MaxQsize)% MaxQsize:
此表达式为循环队列的长度:
a.尾小于头:Q.rear-Q.front + MaxQsize;
b.尾大于头时:队列长度为Q.rear-Q.front;
所以综合两种情况不管什么条件下队列的长度都为(Q.rear-Q.front + MaxQsize)% MaxQsize;
队列与循环链表:
队列包括循环队列是一个逻辑概念,而链表是一个存储概念,一个队列是否是循环链表,不取决于它采用何种存储结构,根据实际需要,循环队列可以采用顺序存储结构,也可以采取链式存储结构;
几种特殊的队列:
双端队列:两端都可增删;
输入受限双端队列:两端可输出,但只能在一端输入;
输出受限双端队列:两端可输入,但只能在一端输出;
五、数组:
a.只有引用形操作,没有加工型操作;
b.数组是多维的结构但是存储空间却是一维(以行或者列为主序存储);
c.随机存取;
六、特殊矩阵的压缩存储:
稀疏矩阵:
利用稀疏因子确定,非零元素个数除以总元素<=0.05
特殊矩阵:非零元素分布有一定规律,(对称,三角,对角矩阵);
随机稀疏矩阵:非零元素随机出现;
对称矩阵元素压缩后位置:
压缩前位置:
比如:
三角矩阵(分上下三角)重复元素存放在一个存储空间:
其余元素同对称压缩相似;
对角矩阵:
所有非零元素集中在以主对角线为中心的带状区域中,其余为零元素;
压缩后位置(以三对角矩阵为例):
总结:
对称 + 对称 = 对称;
对称 * 对称 不一定 对称(除非两个对称相等);
三角 + 三角 = 三角;
三角 * 三角 != 三角;
稀疏 + 稀疏 = 稀疏;
稀疏 * 稀疏 不一定 稀疏;
本章学习重点:
1.掌握栈和队列类型的特点,并可以在相应的问题中正确选用他们;
2.熟练栈类型两种实现方法,特别应注意栈满和栈空的条件以及他们的描述方法;
3.熟练掌握循环队列和链队列的基本操作实现算法,特别注意队满和队空的描述方法;
4.了解数组和两种(行/列优先)的存储表示方法,并掌握数组在以行为主的存储结构中的地址计算方法;
5.掌握对特殊矩阵进行压缩存储时的下标变换公式;
典型例题:
1.
分析:共享的空间中,两栈相对存放,若栈顶相遇即为栈满,故选B;
2.
分析:综合栈的特性,先进后出,故选C
解题技巧:本提条件下,输出序列中,序号不可能升序;
3.
分析:循环队列中如果当前位置为队尾的下一个则队首元素为B,但此题中位置为队尾位置则需要加1,故选C
4.识别读入的一个字符序列是否为反对称序列:
分析:因为刚好相反,即可使用栈;
思路:第一个符号之前的所有字符入栈,后面的每个字符与栈顶元素比对,若相同则出栈,结束后,若栈为空即成功;
实现:
5.
分析:K = 2i+j 可得K= 66+66+65 = 197,但此题二维下标由1开始,故K-2 = 195为正确答案;
6.
正确答案:C;