1.栈
1.1定义
特点:“后进先出”的线性表,简称LIFO表(Last In First Out)
栈是限定在表尾进行插入和删除操作的线性表
就像大家上网的时候,在打开许多网页之后要回到上一个网页,会用到“回退”按钮。如果依次点击“回退”按钮就可以按照访问顺序的逆序加载浏览过得网页,这个操作就是通过“栈”来实现的。
- 栈顶:允许进行插入或者删除操作的一端
- 栈底:栈顶的另一端
- 图示:
1.2基本操作
void Init_Stack(S)//初始化
void Empty_Stack(S)//判断栈空
void Push_Stack(S)//入栈
void pop_Stack(S)//出栈
int Top_Stack(S)//读取栈顶元素
1.3存储结构
- 顺序栈:利用顺序存储结构表示的栈
- 链栈:利用链式存储结构实现的栈,通常用单链表表示
- 顺序栈的类型描述如下:
#define MAXSIZE 20
typedef struct {
int elem[MAXSIZE];
int top;
}SeqStack;
- 链栈的类型描述如下:
typedef struct node{
int data;
struct node *next;
}Node;
typedef struct LinkStack{
Node *top;
int count;
}LinkStack;
1.4两个栈的共享空间
“栈底位置不变,栈顶位置动态变化”,两个栈底分别为-1,MAXSIZE
- 左栈入栈时,栈顶指针加一,右栈入栈时,栈顶指针减一
2.队列
2.1队列的概念(可以联想排队时)
- 特点:“先进先出”
只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,
队尾:进行插入操作的一端
队头:进行删除操作的一端
2.2队列的实现
通常情况下,我们分为两种情况
-
顺序队列: 顺序存储,又可分为
- 静态: 数组存储队列
- 动态: 动态分配的指针
-
链表队列: 链式存储
可以使用数组和链表,但是我们用链表,这样出队列会提高效率
//链式队列
typedef int QUDataType;
typedef struct QueueNode
{
struct QueueNode* _next;
QUDataType _data;
}QueueNode;
typedef struct Queue
{
QueueNode* _front; // 队头
QueueNode* _rear; // 队尾
}Queue;
1.3循环队列
其可以提高空间的利用率