✨Blog:🥰不会敲代码的小张:)🥰
🉑推荐专栏:C语言🤪、Cpp😶🌫️、数据结构初阶💀
💽座右铭:“記住,每一天都是一個新的開始😁😁😁”
💀本章内容:《栈》的介绍✨
前言
本章会介绍栈的特性以及栈的初始化、销毁、插入、删除、取栈顶元素等…
栈的应用场景
那么栈的应用场景有哪些呢?
栈可以达到逆序的功能,利用后进先出的思想。
包括编译器的在对输入的语法进行分析的时候,例如括号的匹配"()“、”{}“、”[]"这些成对出现的符号,借助栈的特性,凡是遇到括号的前半部分,即把这个元素入栈,凡是遇到括号的后半部分就比对栈顶元素是否该元素相匹配,如果匹配,则前半部分出栈,否则就是匹配出错
后续会需要用到栈模拟实现一些知识点,敬请期待。
什么是栈?
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。 它按照后进先出(Last in Firstout)的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
目录
- 前言
- 栈的应用场景
- 什么是栈?
- 栈的创建
- 栈的初始化
- 栈的销毁
- 插入
- 删除
- 判断是否为空
- 栈的大小
- 取栈顶元素
栈的创建
静态数组,内存开大了浪费,开小了不够用
这里我们选择用动态数组开辟空间,内存不够扩容
typedef int STDataType;
struct Stack
{
STDataType* data;
int top;//栈顶
int capcity;//内存容量
};
栈的初始化
首先malloc一块空间,最开始栈是空的,所以top为0
void STInit(struct Stack* ps)
{
assert(ps);
ps->data = (STDataType*)malloc(sizeof(STDataType) * 4);
if (ps->data == NULL)
{
perror("malloc fail");
return;
}
ps->capcity = 4;//容量
ps->top = 0;//当前栈顶
}
栈的销毁
void STDestroy(struct Stack* ps)
{
assert(ps);
free(ps->data);
ps->data = NULL;
ps->capcity = 0;
ps->top = 0;
}
插入
首先进来就判断栈顶是否和容量相等,如果相等说明空间满了,需要realloc空间,一般增加capcity二倍的容量
void STPush(struct Stack* ps, STDataType x)
{
assert(ps);
//扩容
if (ps->top == ps->capcity)
{
STDataType* tmp = (STDataType*)realloc(ps->data, sizeof(STDataType) * ps->capcity * 2);
if(tmp == NULL)
{
perror("STPush relloc fail");
return;
}
ps->data = tmp;//把新realloc的空间再赋给ps->data
ps->capcity = ps->capcity * 2;//更新capcity
}
ps->data[ps->top] = x;//插入到栈顶
ps->top++;//栈顶++
}
删除
记得断言栈不能为空
删除没啥好说的,直接–top就行了,如果下次再插入,会覆盖当前栈顶的值
void STPop(struct Stack* ps)
{
assert(ps);
assert(!STEmpty(ps));//断言不能为空
ps->top--;
}
判断是否为空
top为0说明栈里没有元素,为空
bool STEmpty(struct Stack* ps)
{
assert(ps);
return ps->top == 0;
}
栈的大小
先断言栈不能为空
直接返回top就是栈的大小
int STSize(struct Stack* ps)
{
assert(ps);
assert(!STEmpty(ps));//断言栈不能为空
return ps->top;
}
取栈顶元素
同样是先断言栈不能为空,如果为空,就没有元素可取
这里top-1才是栈顶的元素
STDataType STTop(struct Stack* ps)
{
assert(ps);
assert(!STEmpty(ps));
return ps->data[ps->top - 1];
}
如果觉得对你有帮助,希望留下你宝贵的三连!感谢!!!