栈与队列都是操作受限的线性表
1.栈stack(后进先出 LIFO结构)
包括顺序栈(特殊的有两栈共享空间),链栈
1.1顺序栈
typedef struct
{
//顺序栈结构
SElemType data[MAXSIZE];
int top;//栈顶元素指针 空栈设为-1
}SqStack;
typedef struct
{
//两栈共享空间
SElemType data[MAXSIZE];
int top1,top2;//栈顶元素指针 空栈设为-1和MAXSIZE
}SqDoubleStack;
1.2链栈
//不需要头节点,头指针和栈顶指针合二为一
//链栈的节点
typedef struct StackNode {//结构标记 C语言程序设计现代方法第二版17.5.1
SElemType data;
struct StackNode* next;//next是LinkStackPtr数据类型
}StackNode,*LinkStackPtr;
//头指针结构(相当于把栈元素个数和栈顶指针放一起了)
typedef struct
{
LinkStackPtr top;//top指向栈顶StackNode
int count;
}LinkStack;
1.3栈的应用
1)递归,斐波那契数列的实现
2)四则运算表达式求值,中缀表达式转化为后缀表达式
3)括号匹配
4)进制转换
5)迷宫求解
1.4课后错题
1)c语言标识符以英文or下划线_开头
2)栈只可能发生上溢,指栈顶指针超出了最大范围
3)采用非递归方式重写递归程序(包括边界表达式和边界条件)时,单向递归和尾递归可以不需要借助栈来实现。
2.队列queue(先进先出FIFO结构)
2.1循环队列(顺序存储
typedef struct
{
QElemType data[MAXSIZE];
int front;//头指针
int rear;//尾指针
}SqQueue;
//头指针指向队头元素,尾指针指向队尾元素后一个位置
//在牺牲一个单元来区分队空或队满时
//队满
(Q->rear+1)%MAXSIZE==Q->front
//队列长度
(Q.rear + MAXSIZE - Q.front) % MAXSIZE
也可以通过设置变量count or tag来表示队空或队满。
2.2链队列
typedef struct QNode//链队列的节点结构
{
QElemType data;
struct QNode* next;
}QNode,*QNodePtr;
typedef struct//链队列的头尾指针
{
QNodePtr front, rear;
}LinkQueue;
//为了操作方便,通常会设置头节点
Status InitQueue(LinkQueue* Q) {
//初始化队列(构造空队列
QNodePtr s = (QNodePtr)malloc(sizeof(QNode));//头节点
if (!s)
exit(OVERFLOW);
s->next = NULL;
Q->front = s;
Q->rear = s;
return OK;
}
双端队列通常考察入队序列和出队序列是否对应的问题。输入输出可能部分受限。
2.3队列应用
1)层次遍历(二叉树的层次遍历)
2)打印数据缓冲区
3)多用户引起的资源竞争问题
4)页面替换算法
5)广度优先搜索图
2.4错题
1)单链表实现队列,队头设置在链头。
3.数组和特殊矩阵
考虑如何用最小的空间来存储同样的一组数据
3.1数组的存储结构
3.2特殊矩阵的压缩存储
包括对称、三角、三对角、稀疏矩阵(三元组表、十字链表)
主体的思想就是计算前面的存储元素的个数