C语言深入探究栈的原理
栈
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
文章图片
栈的实现
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的 代价比较小。如下图:
文章图片
文章图片
下面用顺序表(数组)来实现栈;
建立一个顺序表结构:
typedef int STDataType;创建一个结构体变量:ST st;在传数据之前要先初始化;不然当你没赋值就直接访问时会出现乱码或者报警告;
typedef struct Stack
{
STDataType* a;
int top; //表示栈顶
int capacity; //表示容量,当容量满时,扩容;
}ST;
//初始化void StackInit(ST* ps){ assert(ps); //断言,保证传进来的非空; ps->a = NULL; //先将顺序表指针指向空; ps->top = 0; //栈顶位置表示0位置; ps->capacity = 0; //容量为0;}
接下来就是向栈内传数据(压栈),要传结构体地址和要传的数据;
//压栈void StackPush(ST* ps, STDataType x){ assert(ps); //判断:数据从下标0开始,因为pot表示该插入的栈顶的位置,也是压栈的个数//一次插入一个数据,所以数据数量与总容量相同时,就需要扩容 if (ps->top == ps->capacity) {//扩容,扩二倍//使用三目运算符判断,当是第一次扩容时,用二倍没变化,所以固定开辟4个空间;int retcapa = ps->capacity == 0 ? 4 : ps->capacity * 2; STDataType* ret = (STDataType*)realloc(ps->a, sizeof(STDataType)*retcapa); if (ret != NULL){ps->a = ret; ps->capacity = retcapa; }else{printf("realloc开辟失败,退出!"); exit(-1); } }//扩容完,更新数据; ps->a[ps->top] = x; ps->top++; }
有压栈就有出栈;出栈用两个接口。1.返回栈顶数据 2.出栈
因为有时候只需要访问栈顶数据不需要出栈,如果想出栈又想返回数据,就先调用1,再调用2;
//返回栈顶元素;STDataType StackTop(ST* ps){ assert(ps); //直接断言要求栈中必须要有数据; assert(ps->top > 0); return ps->a[ps->top - 1]; } //出栈,顺序表直接把下标减一即可void StackPop(ST* ps){ assert(ps); assert(ps->top > 0); ps->top--; }
有时候还需要返回栈中元素
//返回栈中元素个数;int StackSize(ST* ps){ assert(ps); return ps->top; }
在一些复杂结构中要直接调用查看栈中是否有数据,判断栈是否为空;
//判断栈中元素是否为空,返回布尔类型bool StackEmpty(ST* ps){ assert(ps); return ps->top == 0; //注意这里是没有数据是返回true; }
用动态开辟的空间就必须手动释放
//释放;顺序表释放头指针即可void StackDestroy(ST* ps){ assert(ps); free(ps->a); ps->a = NULL; ps->capacity = ps->top = 0; }
看一下如何调用的:
int main(){ ST st; StackInit(&st); StackPush(&st, 1); StackPush(&st, 2); StackPush(&st, 4); StackPush(&st, 5); StackPush(&st, 7); printf("%d\n",StackTop(&st)); StackPop(&st); StackPush(&st, 8); printf("%d\n",StackTop(&st)); StackPop(&st); StackDestroy(&st); return 0; }
【C语言深入探究栈的原理】到此这篇关于C语言深入探究栈的原理的文章就介绍到这了,更多相关C语言 栈内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 深入理解Go之generate
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- 【1057快报】深入机关,走下田间,交通普法,共创文明
- 生发知识,带你深入了解
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- 深入理解|深入理解 Android 9.0 Crash 机制(二)