数据结构-栈、队列、数组
栈
栈是只允许在一端进行插入或删除操作的线性表。
栈顶:线性表允许插入删除的一端
栈底:固定的不允许插入删除
栈的数学性质:n个不同元素进栈,出栈元素不同排列的个数为
$$ {2n \choose n}\over n+1 $$
栈的基本操作
InitStack(&S) //初始化一个空栈S
StackEmpty(S) //判断是否栈空
Push(&S,x) //进栈
Pop(&S, &x) //出栈
GetTop(S, &x) //读栈顶元素
DestroyStack(&S) //销毁栈
栈的顺序存储结构
采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶元素的位置
#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
共享栈

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

typedef struct{
ElemType data;
struct Linknode *next;
}*LiStack;
队列
队列只允许在表的一端进行插入,在另一端进行删除
队头:允许删除的一端
队尾:允许插入的一端
InitQueue(&Q) //初始化队列
QueueEmpty(Q) // 队列判空
EnQueue(&Q, x) //入队
DeQueue(&Q, x) //出队
GetHead(Q, &x) //读队头元素
队列的顺序存储结构
#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
队列的链式存储结构

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/-。

栈在递归中的应用
队列在层次遍历的应用


数组和矩阵
数组是由n (n≥1)个相同类型的数据元素构成的有限序列,每个数据元素称为一个数组元素,每个元素在n个线性关系中的序号称为该元素的下标,下标的取值范围称为数组的维界。
以一维数组A[ 0...n-1]为例,其存储结构关系式为
$$LOC(a_i) = LOC(a_0)+i*L(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)$$
特殊矩阵
对称矩阵

上三角矩阵

下三角矩阵

三对角矩阵
k = 2i+j-3
稀疏矩阵


浙公网安备 33010602011771号