> 作者简介:დ旧言~,目前大一,现在学习Java,c,c++,Python等
> 座右铭:松树千年终是朽,槿花一日自为荣。
> 望小伙伴们点赞👍收藏✨加关注哟💕💕
🌟前言
前面我们已经学习了顺序表和链表,他们无法控制数据的打印,而栈一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。今天我们来实现一下--《栈》。
🌙主体
这里我们这里需知道栈的简单知识
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
咱们从两个方面实现栈,动态管理,对元素进行操作。
在程序中为了实现栈,需要创建头文件Stact.h ,创建源文件Test.c,Stack.c。
🌠动态管理
💤初始化动态栈
💦1.因为咱们的栈是以数组的形式存储则需要开辟空间
💦2.定义一个数组指针来存储数据
💦3.定义栈顶
1.首先我们在Stact.h定义动态的栈,省得我们再调用(栈),这里和顺序表是一样哒。
//定义数据类型 typedef int STDataType; //定义栈 typedef struct Stack { //定义数组 STDataType* a; //栈顶 int top; //初始容量 int capacity; }ST;
2.对栈进行初始化
实现这个函数那简直就是信手拈来,不会的打手手
//初始化 void STInit(ST* ps) { //断言 assert(ps); //初始化 ps->a = NULL; ps->capacity = 0; ps->top = 0; }
💤释放栈内存
实现这个函数只需要释放ps->a内存,其它值为零
//销毁 void STDestroy(ST* ps) { //断言 assert(ps); //释放内存 free(ps->a); //置空 ps->a = NULL; ps->top = ps->capacity = 0; }
🌠对元素进行操作
💤添加元素
💦1.当开辟的空间等于栈顶则需要扩容
💦2.因为这里是后进先出所以把元素放在栈顶
💦3.再top++
//添加元素 void STPush(ST* ps, STDataType x) { //断言 assert(ps); //当空间不足时需要开辟空间 if (ps->top == ps->capacity) { //扩容 int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2; //开辟空间 STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity); //判断 if (tmp == NULL) { perror("realloc fail"); exit(-1); } //赋值 ps->a = tmp; ps->capacity = newCapacity; } //放元素进栈 ps->a[ps->top] = x; ps->top++; }
💤释放元素(出栈)
这里遵循后进先出就行。
//释放元素(出栈) void STPop(ST* ps) { //断言(栈中不能为空) assert(ps); //栈指针需要大于零 assert(ps->top > 0); //元素减一 --ps->top; }
💤剥离元素
既然是剥离元素,因此需要返回值,因为以数组的形式存储,所以需要下标ps->top - 1,遵循先进先出。
//剥离元素 STDataType STTop(ST* ps) { //断言(栈中不能为空) assert(ps); //栈指针需要大于零 assert(ps->top > 0); //剥离元素 return ps->a[ps->top - 1]; }
💤计算栈中元素个数
写这个函数我觉得太小学生了。
//计算栈中元素个数 int STSize(ST* ps) { //断言 assert(ps); //返回元素个数 return ps->top; }
🌙代码总结
🌠主函数
//包含文件 #include"Stack.h" void TestStack1() { //初始化 ST st; STInit(&st); STPush(&st, 1); STPush(&st, 2); STPush(&st, 3); STPush(&st, 4); STPush(&st, 5); while (!STEmpty(&st)) { printf("%d ", STTop(&st)); STPop(&st); } printf("\n"); STDestroy(&st); } int main() { TestStack1(); return 0; }
🌠Stact.h头文件
//包含头文件 #include<stdio.h> #include<assert.h> #include<stdlib.h> #include<stdbool.h> //定义数据类型 typedef int STDataType; //定义栈 typedef struct Stack { //定义数组 STDataType* a; //栈顶 int top; //初始容量 int capacity; }ST; //初始化 void STInit(ST* ps); //销毁 void STDestroy(ST* ps); //添加元素 void STPush(ST* ps, STDataType x); //释放元素(出栈) void STPop(ST* ps); //剥离元素 STDataType STTop(ST* ps); //计算栈中元素个数 int STSize(ST* ps); bool STEmpty(ST* ps);
🌠Stack.c源文件
//包含文件 #include"Stack.h" //初始化 void STInit(ST* ps) { //断言 assert(ps); //初始化 ps->a = NULL; ps->capacity = 0; ps->top = 0; } //销毁 void STDestroy(ST* ps) { //断言 assert(ps); //释放内存 free(ps->a); //置空 ps->a = NULL; ps->top = ps->capacity = 0; } //添加元素 void STPush(ST* ps, STDataType x) { //断言 assert(ps); //当空间不足时需要开辟空间 if (ps->top == ps->capacity) { //扩容 int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2; //开辟空间 STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity); //判断 if (tmp == NULL) { perror("realloc fail"); exit(-1); } //赋值 ps->a = tmp; ps->capacity = newCapacity; } //放元素进栈 ps->a[ps->top] = x; ps->top++; } //释放元素(出栈) void STPop(ST* ps) { //断言(栈中不能为空) assert(ps); //栈指针需要大于零 assert(ps->top > 0); //元素减一 --ps->top; } //剥离元素 STDataType STTop(ST* ps) { //断言(栈中不能为空) assert(ps); //栈指针需要大于零 assert(ps->top > 0); //剥离元素 return ps->a[ps->top - 1]; } //计算栈中元素个数 int STSize(ST* ps) { //断言 assert(ps); //返回元素个数 return ps->top; } //判断栈中是否还有元素 bool STEmpty(ST* ps) { //断言 assert(ps); //返回值 return ps->top == 0; }
🌟结束语
今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小说手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。