03 栈和队列
栈
-
(顺序栈)定义:只允许在一端进行插入或者删除的线性表
# define MaxSize 50 //定义栈中的最大元素 typedef struct{ Elemtype data[MaxSize]; //存放栈中元素 int top; //栈顶指针 }SqStack;
-
基本操作:
- InitStack(&s): 初始化一个空栈
- StackEmpty(s): 判断一个栈是否为空
- Push(&s,x): 进栈
- Pop(&s, &x) : 出栈
- GetTop(S, &x) : 获取栈顶元素
- ClearStack(&s): 销毁栈
-
其他类型栈
- 共享栈:利用栈低位置相对不变的特性,可以让两个顺序栈共享一个一维空间,将两个栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸
- 链式存储结构栈:和单链表类似,但是没有头节点,一个指针直接指向第一个元素节点(栈顶),最后一个元素为栈底
队列
-
定义:队列简称队,是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另外一端进行删除。
- 队列中插入元素称为入队(进队)
- 队列中删除元素称为出队(离队)
- 对头:允许删除的一端,又称为队首
- 队尾:允许插入的一端
-
基本操作:
- InitQueue(&Q):初始化队列
- QueueEmpty(Q):判断队列为空
- EnQueue(&Q, x):入队
- DeQueue(&Q, & x):出队
- GetHead(Q, &x):读队头元素
-
队列的存储结构
-
队列的顺序存储结构
// 顺序存储就是指分配一块连续的存储单元存放到队列中的元素,并依附两个指针front和rear分别指示队头元素和对位元素 # define Max 50 // 定义队列中元素的最大个数 typedef struct{ ElemType data{Max}; // 存放队列的元素 int frout,rear; // 队头指针和队尾指针 }SqQueue; // 初始状态: Q.front == Q.rear == 0 // 进队操作:队不满时, 先将值送到队尾元素,再将队尾指针加1 // 出队操作:队不为空时,先取队头元素值,再将队头指针加1
-
循环队列
//顺序队列中存在只有一个元素,但是Q.rear == Max的情况,成为假上溢 // 循环列表中,当Q.front = Max-1 后再前进一个位置就自动到0 //---------------------------------------------------------- //初始化:Q.front = Q.rear = 0; //队首指针进1:Q.front = (Q.front + 1) % Max //队尾指针进1:Q.rear = (Q.rear +1) % Max //队列的长度:(Q.rear + Max - Q.front) % Max //出队和进队时:指针都按顺时针方向进1
-
队列的链式结构
//队列的链式表示称为链队列,实际上是一个同时带有队头指针和队尾指针的单链表,头指针指向队头节点,尾指针指向队尾结点(即单链表的最后一个节点) tyepdef struct{ // 链式队列结点 ElemType data; struct LinkNode *next; } typedef struct{ //链式队列 LinkNode *front, *rear; //队列的队头和队尾指针 }LinkQueue;
-
双端队列
// 双端队列指的是允许两端可以进行入队和出队操作的队列
-
特殊矩阵的压缩存储
-
对称矩阵
$ k= \begin{cases}{\frac{i(i-1)}{2}+j-1} &i\ge j\ {\frac{j(j-1)}{2}+i-1} &i<j\ \end{cases} $
-
三角矩阵
$ k= \begin{cases}{\frac{(i-1)(2n-i+2)}{2}+j-i} &i\ge j\ {\frac{n(n+1)}{2}} &i<j\ \end{cases} $
-
三角对称矩阵
-
稀疏矩阵
- 将非零元素及其对应的行和列构成三元组(行标,列表,值)