栈的学习总结
栈的逻辑结构:线性结构→受限线性表
栈的基本操作(来自王道)
栈的数学性质!卡特兰数。
一、顺序栈
顺序栈的存储结构:顺序存储。逻辑地址相邻的数据元素在内存地址上也相邻
注意:
1.1)完成初始化后,关注指针top初始化的两种常见值:-1和0.
=-1即栈顶指针始终指向栈顶(已存储数据)的内存空间【王道】
=0即栈顶指针始终指向栈顶的下一个(未存储数据)的内存空间【严慧敏】
1.2)++i和i++的区别:
++i:先+1,再赋值
i++:先赋值,再+1(同时会需要一个临时的变量来转存)
共享栈:两个栈共享一片连续的内存空间。两个栈顶指针分别指向两端,一段入栈时+,另一端入栈时-。
二、链栈
存储结构:链式存储
运算:创、增、删、改、查、判空/判满
判满不需要。
可以不用头结点。
三、共享栈
逻辑结构:线性结构→受限线性表
存储结构:顺序存储
运算:…创、增、删、改、查、判空/判满
创建时,须有2个栈顶指针对应共享栈中的两个顺序栈。
队列的学习总结
队列的逻辑结构:线性结构→受限线性表
队列的基本操作(来自王道)
特点:先入先出。头(队头,front)删尾(队尾,rear)插
一、存储结构为顺序存储的队列
1.顺序存储结构描述:(用循环队列表示)
//循环队列的存储结构 == 和队列一致
typedef struct
{
int data[SqQuMaxsize];
int SqQufront, SqQufront; //front队首出队指向待出队元素, rear队尾入队指向待入队元素的下一个空位置
}SqQueue;
2.注意:
//初始时,SqQufront = SqQufront = 0; 在初始化函数中有
//队满条件:(Q.SqQurear+1)%SqQuMaxsize == Q.SqQufront
//队空条件:Q.SqQurear == Q.SqQufront
//当前队列长度 = (Q,SqQurear - Q.SqQufront + SqQuMaxsize)%SqQuMaxsize; 因为循环队列,可能rear-front是负数,所以要+一个max。并且取模处理
二、存储结构为链式存储的队列
1.链式存储结构描述:
//链队列的存储结构
typedef struct LinkNode
{
int data;
struct LinkNode *next;
}LinkNode;//定义一个结点
typedef struct
{
LinkNode *lifront, *lirear;
}LinkQuene;//定义队头队尾的指针变量
2.注意:
2.1实质是一个同时带有队头指针和队尾指针的单链表。
2.2通常会设置头结点,便于操作。
三、双端队列
定义:是指允许两端都可以进行入队和出队操作的队列。两端分称为前端和后端
·那么:只有一段进行插入/删除 == 栈;一端只能输入,另一端只能输出 == 队列
定义:双端队列能够同时插入和删除的一段称为前端。
定义:前端进队的元素始终排列在后端进队的元素的前面。
也就意味着,前端进入的元素和后端进入的元素是有一堵墙相隔开的。按1、2、3、4顺序分别进队,前端进124,后端进3。那么从后端往前端看,就是3、1、2、4。
定义:出队不看前端或后端,先出的元素始终排列在后出的元素前面。
理解上述定义,基本就能做题了。
四、队列在计算机中的应用
1. 主机与外设之间速度不匹配问题
2. 多用户引起的资源竞争问题
3. 图的层序遍历、广度优先遍历