严蔚敏视频 笔记09
理解递归算法
3.3 栈类型的实现
顺序栈
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct {
SElem Type *base;
SElem Type *top;
int stacksize;
} SqStack;
链栈
线性表操作的特例,不再讨论 要注意指针方向
3.4 队列的类型定义
ADT Queue {
数据对象:
D={ai|ai∈ElemSet,i=1,2,…n,n>=0}
数据关系:
R1={<ai-1,ai>|ai-1,ai∈D,i=2,…n}
约定其中a1端为队列头,an端为队列尾
基本操作:
InitQueue(&Q)
DestroyQueue(&Q)
QueueEmpty(Q)
QueueLength(Q)
GetHead(Q,&e)
ClearQueue(&Q)
EnQueue(&Q,e)
DeQueue(&Q,&e)
}
GetHead(Q,&e) 取队头
DeQueue(&Q,&e) 出队列:取出队头的同时删除
EnQueue(&Q,e) 入队列
3.5 队列类型的实现
链队列——链式映象
循环队列——顺序映象
链队列
typedef struct QNode {
QElemType data;
struct QNode *next;
} QNode, *QueuePtr;
typedef struct {
QueuePtr front; // 队头指针
QueuePtr rear; // 队尾指针
} LinkQueue;
出队列一般修改头结点的指针域就可以,当只有一个队列元素的时候注意还要修改rear
循环队列
#define MAXQSIZE 100 // 最大队列长度
typedef struct {
QElemType *base; // 动态分配存储空间
int front; // 头指针,若队列不空指向队列头元素
int rear; // 尾指针,若队列不空,指向队列尾元素的
下一个位置
} SqQueue;
不能进行再分配
如何区分队满和队空?
方法一:浪费一个空间 (Q.rear+1)%maxsize=Q.front为满
仿真排队都要用到队列
例子:理发馆座位设置问题 仿真模拟一下
本章小结
1掌握栈和队列特点,在相应应用问题中正确选用
2熟练掌握栈类型的两种实现方法,特别注意栈满和栈空的条件及描述的方法
3熟练掌握循环队列和链队列的基本操作实现算法,特别注意队满和队空的描述方法
4理解递归算法执行过程中栈的状态变化过程