数据结构【栈】有哪些应用场景?

足球世界杯规则

✨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];

}

如果觉得对你有帮助,希望留下你宝贵的三连!感谢!!!