![在这里插入图片描述](https://img-blog.csdnimg.cn/20201221141514795.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NvbG9WZXJzaW9u,size_16,color_FFFFFF,t_70#pic_center)
1. 栈的基本概念
1.1 栈的定义
只允许在一端进行插入、删除操作的线性表
1.2 栈的特点
- LIFO:后进先出
- 最先进栈的元素,不一定是最后出栈,只限制了进栈的顺序,没有限制出栈的顺序
1.3 栈的基本说明
- 栈是一种线性表,栈元素具有线性关系,即前驱后继关系
- 栈顶(top):允许插入、删除的一端
- 栈底(bottom):不允许插入、删除的一端
- 空栈:不含任何元素的栈
2. 栈的顺序存储结构
2.1 顺序栈的实现
2.1.1 顺序栈的定义
栈的顺序存储的实现就是顺序栈,利用一组地址连续的存储单元存放自栈底到栈顶的数据元素。
2.1.2 栈的顺序存储类型描述
#define MaxSize 50
typedef struct{
ElemType data[MaxSize];
int top;
}SqStack;
2.1.3 顺序栈的基本说明
- 栈空状态:s.top = -1;
- 栈满状态:s.top = MaxSize - 1;
- 元素进栈时:先栈顶指针加一,再送值入栈
- 元素出栈时:先取出栈顶元素,再栈顶指针减一
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201221144920292.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NvbG9WZXJzaW9u,size_16,color_FFFFFF,t_70#pic_center)
2.2 顺序栈的基本运算
2.2.1 初始化栈
实现思路
1. 将栈顶指针top置为 1
实现代码
void InitStack(SqStack *s){
s->top = -1;
}
2.2.2 判断栈空
实现思路
1. 先查看栈顶指针是否为 -1
2. 栈空返回 1 ,栈非空返回 0
实现代码
int StackEmpty(SqStack s){
if(s.top == -1){
return 1;
}
else{
return 0;
}
}
2.2.3 进栈
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201221141542220.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NvbG9WZXJzaW9u,size_16,color_FFFFFF,t_70#pic_center)
实现思路
1. 判断栈是否已满
2. 栈不满时,先栈顶指针加一,再送值进栈
3. 进栈成功返回1,失败返回0
实现代码
int Push(SqStack *s