数据结构栈的实现

news/2024/11/30 1:31:22/

目录

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

栈的概念

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

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

栈的结构声明

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


http://www.ppmy.cn/news/1536.html

相关文章

IDEA创建Java Web项目

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:JAVA开发者…

微机-------CPU与外设之间的数据传送方式

目录 一、无条件方式二、查询方式三、中断方式四、DMA方式一、无条件方式 外设要求:简单、数据变化缓慢。 外设被认为始终处于就绪状态。始终准备好数据或者始终准备好接收数据。 IN AL,数据端口 数据端口的地址通过CPU的地址总线送到地址译码器进行译码,同时该指令进行的是…

内存优化之重新认识内存

我们知道,手机的内存是有限的,如果应用内存占用过大,轻则引起卡顿,重则导致应用崩溃或被系统强制杀掉,更严重的情况下会影响应用的留存率。因此,内存优化是性能优化中非常重要的一部分。但是,很…

Clickhouse 使用DBeaver连接

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。 OLTP是传统的…

如何选择和使用腾讯云服务器的方法新手教程

本文将介绍如何选择和使用腾讯云服务器的方法新手教程。云服务器能帮助快速构建更稳定、安全的应用,降低开发运维的难度和整体IT成本。腾讯云CVM云服务器提供多种类型的实例、操作系统和软件包。各实例中的 CPU、内存、硬盘和带宽可以灵活调整,以满足应用…

自制肥鲨HDO2电源升压延长线

自制肥鲨HDO2电源升压延长线1. 问题源由2. 解决方案3. 材料准备4. 最终延长线产出4.1 裸照4.2 成品5. 参考资料1. 问题源由 之前我们介绍了【自制肥鲨HDO2电源降压延长线,支持3S~6S动力电池】,主要解决使用动力电池给眼镜供电的问题。 但是马上有兄弟反…

面试整理一

** 面试整理 ** 借鉴链接:https://www.cnblogs.com/xiamaojjie/p/11891396.html https://blog.csdn.net/m0_58395003/article/details/117232056 https://zhuanlan.zhihu.com/p/58370623 框架分层:自动化测试框架分为5层(配置层&#xff0c…

About 12.4 This Week

Motivation: 1. Piano 2. Math 3. English 4. RE 一:Math 这周就把1000题终于做完了然后数学就躺平了,没什么心情学数学,可能是之前的强化卷把我淦懵了,一道题算好久依然没有什么正向反馈,在集训前把强化卷与测验卷总…