🎊介绍完顺序表和链表,接下来我们介绍一下第三种线性表——栈基本功能的实现
一、栈的概念及结构
🎡概念
栈是一种特殊的线性表,只允许在固定的一段进行插入删除操作,我们把进行插入删除操作的这一端称为栈顶,另一端称为栈底。栈中的元素遵循后进先出LIFO(last in first out)的原则。可以把栈想象成放东西的箱子或者是弹夹,先放进去的东西压在了底下,要先把上面的东西拿走之后才能拿下面的东西。
压栈:又叫入栈、进栈,是在栈顶插入元素的操作
出栈:数据的删除操作也在栈顶
🎡结构
栈又分顺序栈和链栈,顺序栈就是用数组实现,链栈就是用单链表或双链表去实现。
顺序栈用数组的尾做栈顶,因为在插入删除操作时都是在栈顶进行,所以弥补了顺序表在表头进行插入删除操作时需要大量移动数据的缺陷,顺序栈唯一的缺点就是空间不足时需要增容
链栈用单链表实现栈要用头做栈顶,因为如果尾做栈顶的话,插入操作是非常方便的,但是每次在输出、删除元素时都需要从头遍历链表;如果要用尾做栈顶,要用双向链表
顺序栈是最常用的也是比较推荐的栈的结构,相对于链栈,顺序栈不需要另外一块空间去存储地址,节省了空间,且在插入删除元素时更加方便,当然,根据实际需要可以选择适宜的结构,在这里我们会用顺序栈来实现栈的功能
二、基本功能的实现
🎡头文件
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top; // 栈顶
int capacity; // 容量
}Stack;
🎡函数声明
//菜单
void meum();
//初始化栈
void StackInit(Stack* ps);
//判断是否需要扩容
void CheckCapacity(Stack* ps);
//入栈
void StackPush(Stack* ps, STDataType data);
//出栈
void StackPop(Stack* ps);
//打印栈中元素
void StackPrint(Stack ps);
//获取栈顶元素
STDataType StackTop(Stack* ps);
//获取栈中有效元素个数
int StackSize(Stack* ps);
//检测栈是否为空
int StackEmpty(Stack* ps);
//清空栈
void StackClear(Stack* ps);
//销毁栈
void StackDestroy(Stack* ps);
🎡初始化栈
//初始化栈
void StackInit(Stack* ps)
{
assert(ps);
ps->a = (STDataType*)calloc(4, sizeof(STDataType));
if (ps->a == NULL)
{
perror("calloc fail!");
}
ps->capacity = 4;
ps->top = 0;
}
🎡判断是否需要扩容
//判断是否需要扩容
void CheckCapacity(Stack* ps)
{
assert(ps);
if (ps->top >= ps->capacity)
{
ps->capacity += 4;
ps->a = (STDataType*)realloc(ps->a, sizeof(STDataType) * ps->capacity);
}
}
🎡入栈
//入栈
void StackPush(Stack* ps, STDataType data)
{
assert(ps);
CheckCapacity(ps);
ps->a[ps->top] = data;
ps->top++;
}
🎡出栈
//出栈
void StackPop(Stack* ps)
{
assert(ps);
ps->top--;
}
🎡打印栈中元素
//打印栈中元素
void StackPrint(Stack ps)
{
for (int i = 0; i < ps.top; i++)
{
printf("%d ", ps.a[i]);
}
printf("\n");
}
🎡取栈顶元素
//获取栈顶元素
STDataType StackTop(Stack* ps)
{
assert(ps);
return ps->a[ps->top - 1];
}
🎡判断是否为空栈
//检测栈是否为空
int StackEmpty(Stack* ps)
{
assert(ps);
if (ps->top == 0)
return 1;
else return 0;
}
🎡获取栈中有效元素个数
//获取栈中有效元素个数
int StackSize(Stack* ps)
{
assert(ps);
return ps->top;
}
🎡清空栈
//清空栈
void StackClear(Stack* ps)
{
assert(ps);
ps->top = 0;
}
🎡销毁栈
//销毁栈
void StackDestroy(Stack* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->capacity = ps->top = 0;
}
好了,这就是栈的基本功能和对应的实现方法,有问题的地方欢迎评论区留言,如果感觉有帮助,还请三连支持!!!
需要完整代码call我!