数据结构-栈、队列、数组
且任容枯 Lv4

栈是只允许在一端进行插入或删除操作的线性表。
栈顶:线性表允许插入删除的一端
栈底:固定的不允许插入删除

栈的数学性质:n个不同元素进栈,出栈元素不同排列的个数为
$$ {2n \choose n}\over n+1 $$
栈的基本操作

1
2
3
4
5
6
7
8
9
10
11
InitStack(&S) //初始化一个空栈S

StackEmpty(S) //判断是否栈空

Push(&S,x) //进栈

Pop(&S, &x) //出栈

GetTop(S, &x) //读栈顶元素

DestroyStack(&S) //销毁栈

栈的顺序存储结构

采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶元素的位置

1
2
3
4
5
6
7
8
9
#define MaxSize 50

typedef struct{

    ElemType data[MaxSize];

    int top;

}SqStack;

栈顶指针:S.top, 初始设置S.top = -1;
栈顶元素:S.data[ S.top ]
进栈:先栈顶加1, 再进栈
出栈:先出栈,再-1
栈空:S.top == -1
栈满:S.top == MaxSize-1
栈长:S.top + 1

共享栈
Pastedimage20230721223556
两个栈的栈顶指针都指向栈顶元素,top0=-1时0号栈为空,top1=MaxSize时1号栈为空;仅当两个栈顶指针相邻(top1-top0=1)时,判断为栈满。当0号栈进栈时top0先加1再赋值,1号栈进栈时top1 先减1再赋值;出栈时则刚好相反。

栈的链式存储结构

Pastedimage20230721223817

1
2
3
4
5
6
7
typedef struct{

    ElemType data;

    struct Linknode *next;

}*LiStack;

队列

队列只允许在表的一端进行插入,在另一端进行删除
队头:允许删除的一端
队尾:允许插入的一端

1
2
3
4
5
6
7
8
9
InitQueue(&Q) //初始化队列

QueueEmpty(Q) // 队列判空

EnQueue(&Q, x) //入队

DeQueue(&Q, x) //出队

GetHead(Q, &x) //读队头元素

队列的顺序存储结构

1
2
3
4
5
6
7
8
9
#define MaxSize 50

typedef struct{

    ElemType data[MaxSize];

    int front,rear;

}SqQueue;

队空条件:Q.front == Q.rear == 0
入队:先送值到队尾元素,再将队尾指针加1
出队:先取队头元素值,再将队头指针加1
循环队列
初始:Q.front = Q.rear = 0
队首指针进1:Q.front = (Q.front+1)%Maxsize
队尾指针进1:Q.rear = (Q.rear+1)%Maxsize
队列长度:(Q.rear-Q.front+Maxsize)%Maxsize
队满 (Q.rear+1)%Maxsize = Q.front

队列的链式存储结构

Pastedimage20230721233542

1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct LinkNode{

    ElemType data;

    struct LinkNode *next;

}LinkNode

typdef struct{

    LinkNode *front, *rear;

}LinkQueue;

当Q.front == NULL且 Q.rear == NULL时,链式队列为空。

栈和队列的应用

栈在表达式求值中的应用

中缀表达式A+B*(C-D)-E/F所对应的后缀表达式为ABCD- * +EF/-。
Pastedimage20230722152940

栈在递归中的应用

队列在层次遍历的应用

Pastedimage20230722153100
Pastedimage20230722153114

数组和矩阵

数组是由n (n≥1)个相同类型的数据元素构成的有限序列,每个数据元素称为一个数组元素,每个元素在n个线性关系中的序号称为该元素的下标,下标的取值范围称为数组的维界。
以一维数组A[ 0…n-1]为例,其存储结构关系式为
$$LOC(a_i) = LOC(a_0)+iL(0<=i<n)$$
多维数据的映射 行下标与列下标的范围分别为[0,h_1]与[0,h_2]
#行优先
![[Pasted image 20230722155443.png]]
$$LOC(a_i,_j = LOC(a_0,_0)+[i
(h_2+1)+j]L)$$
#列优先
![[Pasted image 20230722155453.png]]
$$LOC(a_i,_j = LOC(a_0,_0)+[j
(h_1+1)+i]*L)$$

特殊矩阵

对称矩阵
Pastedimage20230722155645
上三角矩阵
Pastedimage20230722155903
下三角矩阵
Pastedimage20230722155930
三对角矩阵
k = 2i+j-3
稀疏矩阵
Pastedimage20230722160115