2022.3.8 星期三 课堂笔记
第三章 栈和队列
参考教材:数据结构(C语言版)/严蔚敏,李冬梅,吴伟民编
3.1栈和队列的定义和特点
3.1.1 栈的定义和特点
1、定义:仅允许在表尾(栈顶)端进行插入或删除的线性表。
栈顶 top 栈底 base
2、特点:LIFO(FILO)
3、图示
3.1.2 队列的定义和特点
1、定义:只允许在标的一端进行插入,而在另一端删除元素
队尾 rear 对头 front
2、特点:FIFO
3、图示
3.3 栈的表示和操作的实现
3.3.1 栈的类型定义
3.3.2 顺序栈的表示和实现
1、栈空的语句表示 :
2、(1)base始终指向栈底处
(2)top始终指向栈顶元素的上一个位置
3、图示
2022年3月27日 星期一 课堂笔记
3.3.2 顺序栈的表示和实现
1、初始化
S.base=new SElemType[MAXSIZE];
S.top=S.base;
S.stacksize=MAXSIZE;
2、入栈(push)
S.top-S.base==MAXSIZE; //判断栈满
*S.top++=e;
3、出栈
S.top==S.base
e=*--S.top;
4、取栈顶元素
S.top!=S.base
return *(S.top-1);
课堂练习
如果一个栈的输入序列为123456,能否得到435612和135426的出栈序列?
435612 不可以 135426可以
3.3.3 链栈的表示和实现
1、初始化
S=NULL;
return OK;
2、入栈
p=new StackNode; //生成新结点
//将新结点数据域置为e
//将新结点插入栈顶
//修改栈顶指针为p
3、出栈
e=S—>data; //将栈顶元素赋给e
p=S; //用p临时保存栈顶元素空间,以备释放
S=S—>next; //修改栈顶指针
delete p; //释放原栈顶元素的空间
4、取栈顶元素
return S—>data; //返回栈顶元素的值
2022.3.22 星期二 课堂笔记
3.4 栈与递归
3.4.1 采用递归算法解决的问题
1)定义:自己调用自己
2)设置条件:终止条件和递归步骤
3)掌握两个实例 (fact,fib)
3.5 队列的表示和操作的实现
2.队列
1)队列定义:Queue,Q;特点:FIFO
两个重要的指针:front 始终指向队头元素处
rear 始终指向队尾元素的下一个位置
2)队列和栈的区别:两指针指向栈底元素处
栈: base 始终指向栈底元素处
top始终指向栈底元素处
3)判断队列空的语句
Q.rear==Q.front
4)假溢出与真溢出的区别:(出简答题)
假溢出:队列中实际的存储空间,没有占满,但无法进队的情况。
真溢出:队列中实际的存储空间,已经占满,无法进队的情况
5)如何解决假溢出?
利用循环来解决,方法:求模(依环状增1)
6)判断队空和队满
队空:Q.front==Q.rear
队满:(Q.rear+1)%MAXQSIZE==Q.front