数据结构栈的实现
创始人
2024-03-17 06:40:35
0

目录

  • 栈的概念
  • 栈的结构声明
  • 初始化
  • 数据入栈
  • 出栈
  • 判断栈是否为空
  • 取栈顶的值
  • 销毁栈

栈的概念

栈是一种线性表,插入数据的一端叫栈顶,另一端叫栈底。
入栈:数据从栈顶进入栈中
出栈:数据从栈顶删除
所以,栈的特点就是先进后出,也可以说后进先出。

入栈图
在这里插入图片描述
出栈图
在这里插入图片描述
根据栈先进后出的性质,我们来实现一个简单的栈。

栈的结构声明

typedef int STDataType;struct Stack
{//存放数据的空间STDataType* data;//栈顶位置size_t top;//栈的容量size_t Cacpcity;
}ST;

初始化

初始化很简单,我们让data指向的空间为NULL,顶部位置从0开始,每插入一个数据就+1。

//初始化
void StackInto(ST* ST)
{ST->data = NULL;ST->top = 0;ST->Cacpcity = 0;
}

在这里插入图片描述
我们可以看到初始化成功了。

数据入栈

栈初始化好后,我们就要把数据插入栈中,因为是先进后出,所以我们直接在数组尾部插入即可。
在这里插入图片描述


//容量更新
void CheckCacpcity(ST* ST)
{//容量等于top时,说明数组没有空间了if (ST->Cacpcity == ST->top){//如果空间为0,初始空间4,如果不为0,空间*2int NewCacpcity = ST->Cacpcity == 0 ? 4 : ST->Cacpcity * 2;//扩容STDataType* newdata = (STDataType*)realloc(ST->data,sizeof(STDataType) * NewCacpcity);//扩容是否成功if (newdata == NULL){printf("reallo fail\n");exit(-1);}ST->data = newdata;//更新容量ST->Cacpcity = NewCacpcity;}
}//数据入栈
void StackPush(ST* ST, STDataType x)
{//断言,传进来的指针不能为空assert(ST);//容量不够自动增容CheckCacpcity(ST);//尾部数据入栈*(ST->data+ST->top) = x;ST->top++;
}

在这里插入图片描述

然后我们发现数据入栈。并且容量更新了。

出栈

因为栈是后进来的先出去,所以直接删除最后一个元素即可。
在这里插入图片描述

//数据出栈
void StackPop(ST* ST)
{assert(ST);//如果top等于0,说明没有元素了assert(ST->top > 0);//出栈操作,就是这么简单ST->top--;}

判断栈是否为空

直接判断top的值是否为0即可,返回真即为空。


//栈是否为空
bool StackEmpty(ST* ST)
{assert(ST);return ST->top == 0;
}

取栈顶的值

同样很简单,top-1的值就是栈顶的值,但是要注意栈必须不为空。

//取栈顶的值
STDataType StackTop(ST* ST)
{assert(ST);assert(!StackEmpty(ST));return ST->data[ST->top - 1];
}

入栈的顺序是1 2 3 4 5 ,出栈的顺序是 5 4 3 2 1
在这里插入图片描述

销毁栈

这个也简单,top和capacity置为0,释放掉data,指针置为空即可。

//销毁
void StackDestroy(ST* ST)
{assert(ST);ST->top = ST->Cacpcity = 0;free(ST->data);ST->data = NULL;
}

在这里插入图片描述
销毁成功。
代码已上传至git

相关内容

热门资讯

汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...