一、概念
1、栈:是限定仅在表尾进行插入和删除的线性表,栈又称为FILO先进后出的线性表
我们通常把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)
不含任何数据元素的栈称为空栈
- 顺序栈 ---- 数组(以顺序表的形式实现栈的特性)
- 链栈 ---- 链表(以链表的形式实现栈的特性)
注意:
- 每次入栈时须知:数组中当前哪个位置可以插入元素(数组的尾部)
- 除了地址可以做唯一的标识外,此处的下标也可做唯一的标识
- 栈是一种数据结构(增删改查),实现了FILO的特征
- 查找:每次只能获取栈顶的元素
2、栈的操作
栈的插入操作(push),叫做进栈,也称压栈、入栈
栈的删除操作(pop),叫做出栈,也称弹栈
二、实现
1、存储结构
typedef int ElemType;
#define STACK_SIZE 10
typedef struct Stack
{
ElemType data[STACK_SIZE];//data 栈数据空间
int top;//栈顶指针 存放下标
}Stack,*pStack;
2、初始化
void init(pStack pst)
{
if (pst != nullptr)
{
pst->top = 0;
}
}
3、进栈
进栈操作时需先判断所要进入的栈是否已满
(1)判满
int full(pStack pst)
{
return pst->top == STACK_SIZE ? 1 : 0;
}
当栈顶等于栈的最大空间时,说明该栈已满
(2)进栈
int push(pStack pst, ElemType val)
{
if (full(pst))//栈满
{
return -1;
}
pst->data[pst->top] = val;
pst->top++;
//pst->data[pst->top++] = val;
//0 pst->data[0];
//1 pst->data[1];
return 1;
}
4、出栈
出栈需先判断栈中是否有元素,若栈空,则不用出栈
(1)判空
int empty(pStack pst)
{
return pst->top == 0 ? 1 : 0;
}
(2)出栈
int pop(pStack pst)//只删元素 不获取元素
{
if (empty(pst))
{
return 0;
}
pst->top--;
return 1;
}
5、获取栈顶元素
//返回值返回状态 0-》栈空 1-》成功 形参把栈顶元素带出
int gettop(pStack pst, ElemType* prt)//拿到栈顶元素 并不删除
{
if (empty(pst))//栈空
{
return 0;
}
*prt = pst->data[pst->top - 1];
return 1;
}
6、主函数
#include <stdio.h>
#include "Stack.h"
//顺序栈
int main()
{
Stack st; //栈生成
init(&st);
for (int i = 0; i < STACK_SIZE - 1; i++)
{
push(&st, i + 1);
}
push(&st, 10);//10插入成功 插入后 栈满
push(&st, 11);//11插入失败
int rt = 0;
int flag = gettop(&st, &rt);
if (flag)
{
printf("rt:%d\n", rt);
}
return 0;
}