数据结构——栈的详细介绍

数据结构——栈

  • 一、栈的结构和概念
  • 二、 栈的两种构建方式
    • ①、用数组进行构建
    • ②、用链表进行构建
  • 三、栈的创建
  • 四、栈的初始化
  • 五、栈的销毁
  • 六、压栈
  • 七、出栈
  • 八、判空
  • 九、获取栈顶元素
  • 十、获取栈的size

一、栈的结构和概念

栈:栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
在这里插入图片描述

二、 栈的两种构建方式

①、用数组进行构建

在这里插入图片描述

②、用链表进行构建

在这里插入图片描述
本篇我们采用数组构建的方式为大家进行讲解。本篇博客主要从栈的初始化、栈的销毁、压栈出栈等七个方面为大家全面进行栈的讲解。

//初始化
void InitST(ST* pst);
//销毁
void DestoryST(ST* pst);
//压栈
void PushST(ST* pst, STDatatype x);
//出栈
void PopST(ST* pst);
//判空
bool STEmpty(ST* pst);
//获取栈顶元素
STDatatype TopST(ST* pst);
//获取栈的size
int STSize(ST* pst);

三、栈的创建

typedef struct STack
{STDatatype* a;//数组int capacity;//容量int top;//栈顶元素的下一个
}ST;

我们采用结构体的方式创建一个结构体成员变量,其中定义了数组指针a,capacity容量,和top。其中a指向的是栈的开始位置,capacity指向的是栈的结束位置,至于top,则既可以指向栈顶位置,也可以指向栈顶元素的下一个位置,这取决于你对其,如何进行初始化。
在这里插入图片描述

四、栈的初始化

栈的初始化中,最为重要的一步便是如何对pst->top进行相应的初始化,如果我们将pst->top初始化为0,则top将指向栈顶元素的下一个位置。但是如果我们将其初始化为-1,则top将指向栈顶元素。但是如果将其初始化为-1,也会带来一些不必要的麻烦,例如一些不懂的栈结构的人,可能会以为这里初始化错误。所以我们在这里将其初始化为0.

void InitST(ST* pst)
{assert(pst);pst->a = NULL;pst->capacity = 0;//栈顶元素的下一个位置pst->top = 0;
}

五、栈的销毁

利用free函数将开辟的内存空间进行释放,并将其置为NULL,并把capacity和top置为0。

void DestoryST(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->capacity = pst->top = 0;
}

六、压栈

由于栈的后进先出特性,我们便只能对栈顶元素进行出栈操作,不能随意的对其他元素进行出栈操作。出栈函数非常简单,首先是扩容部分,如果数组内存不够,便对其进行扩容操作。然后在栈顶处,插入数据即可。

void PushST(ST* pst, STDatatype x)
{if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDatatype *tmp = (STDatatype*)realloc(pst->a, sizeof(STDatatype) * newcapacity);if (tmp == NULL){perror("realloc fail");return;}pst->a = tmp;pst->capacity = newcapacity;}//插入数据pst->a[pst->top] = x;pst->top++;

七、出栈

出栈操作,我们直接对pst->top进行–操作即可。但是,这里需要注意的是当数组元素全部删除完毕之后,便不能对其进行删除操作了,所以这里需要对其进行判空。

oid PopST(ST* pst)
{assert(pst);assert(!STEmpty(pst));pst->top--;
}

八、判空

直接判断pst->top是否等于0,如果pst->top等于0则返回true,否则返回false。

bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}

九、获取栈顶元素

这里需要注意的是由于我们定义的是pst->top=0,即表示的是栈顶元素的下一个位置,所以当我们想要获取栈顶元素时,我们需要对其进行==-1操作==,返回栈顶元素。

//获取栈顶元素
STDatatype TopST(ST* pst)
{assert(pst);assert(!STEmpty(pst));return pst->a[pst->top-1];
}

十、获取栈的size

直接将pst->top进行返回操作。

//获取栈的size
int STSize(ST* pst)
{assert(pst);return pst->top;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/158905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+Redis实现点赞/排行榜功能,可同理实现收藏/关注功能,可拓展实现共同好友/共同关注/关注推送功能

前言 简单记录一下在SpringBoot项目中,使用Redis实现点赞/排行榜功能,可同理实现收藏/关注功能,可拓展实现共同好友/共同关注/关注推送功。主要用到了Redis中的Set集合和ZSet集合。 一、指定使用某个索引的数据库 在Redis中,可…

JVM 之 字节码指令

目录 一. 前言 二. 指令集 2.1. 支持的数据类型 2.2. 指令分类 三. 指令手册 3.1. 操作数栈 3.2. 运算与转换 3.3. 条件转移 3.4. 类与数组 3.5. 调度与返回加 finally 3.6. 指令手册汇总 3.7. 示例 一. 前言 字节码指令集的特点是数据量短小精干,便于传…

第15届蓝桥STEMA测评真题剖析-2023年10月29日Scratch编程初中级组

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第160讲。 第15届蓝桥第2次STEMA测评,这是2023年10月29日举办的STEMA,比赛仍然采取线上形式。这…

Autoware.universe部署06:使用DBC文件进行UDP的CAN通信代码编写

目录标题 一、安装DBC文件编辑工具VectorCANdb二、编写DBC文件2.1 CAN通信协议2.2 编写DBC文件2.2.1 根据CAN协议设置signals2.2.2 设置报文2.2.3 建立节点 三、根据DBC文件编写ROS2驱动程序四、实际通信调试 根据CAN协议编写DBC文件,通过DBC文件编写ROS2包进行UDP通…

mysql8忘记密码如何重置

mysql5.7.6版本后 废弃user表中 password字段 和 password()方法,所以旧方法重置密码对mysql8.0版本是行不通的 1、配置免密码登陆 找到mysql配置文件编辑 vim /etc/my.cnfubuntu下一般是 /etc/mysql/mysql.conf.d/mysqld.cnf centos下一般…

win10 eclipse安装教程--

前言:安装eclipse之前必须安装JDK, 链接: 详细解读JDK与eclipse的安装,配置环境变量

jetpack compose中实现丝滑的轮播图效果

写在前面 最近在翻Jetpack库,发现了DataStore,官方是这么说的: Jetpack DataStore 是一种数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。 …

laravel引入element-ui后,blade模板中使用elementui时,事件未生效问题(下载element-ui到本地直接引入项目)

背景 重构公司后台项目,使用了dcat-admin,但是dcat-admin有些前端功能不能满足需求。因此引入element-ui进行相关界面的优化 具体流程 1.下载element-ui到本地 2.进入如下目录 打开 node_modules\element-ui\lib 复制index.js 打开 node_modules/ele…

vue2和vue3的区别,优缺点,vue3新特性

这里写自定义目录标题 vue3的新特性:setupvue3和vue2的区别Vue3是Vue.js的最新版本,相比于Vue2有以下优点和缺点:vue它的最新版本是 Vue 3。Vue 3 有多个版本迭代,它们之间的主要不同 vue3的新特性:setup setup函数是 Vue 3 中的一个新特性&…

[Linux] shell条件语句和if语句

一、条件语句 1.1 测试 test 测试文件的表达式是否成立 格式:test 条件表达式 [ 条件表达式 ] 选项作用-d测试是否为目录-e测试目录或文件是否存在-a测试目录或文件是否存在-f测试是否为文件-r测试当前用户是否有权限读取-w测试当前用户是否有权限写入-x测试当前…

一键合并多个TXT文本,将保存在TXT的快递单号进行一键合并

如果你需要处理大量的TXT文本文件,那么你可能会遇到需要将这些文件合并为一个文件的情况。这不仅涉及到文件的组织和管理,还可能涉及到文件内容的连贯性和完整性。现在,我们有一个强大的工具,可以帮助你轻松实现一键文件整理&…

PCB抄板的一些方法

PCB抄板的技术实现过程简单来说,就是先将要抄板的电路板进行扫描,记录详细的元器件位置,然后将元器件拆下来做成物料清单(BOM)并安排物料采购,空板则扫描成图片经抄板软件处理还原成pcb板图文件&#xff0c…

私域电商模式全解析:掌握这些方法,让你的生意不再难做!

私域电商是指利用微信、QQ等社交平台将客户流量转化和沉淀,并促使其进行重复购买的电商模式。私域电商具备两个主要特点,分别是“私域”和“电商”。 “私域”指的是将客户添加为好友,并利用微信、QQ、微博等社交平台进行联系和营销的模式。…

2023亚太地区数学建模C题思路分析+模型+代码+论文

目录 1.2023亚太地区各题思路模型:比赛开始后,第一时间更新,获取见文末名片 3 常见数模问题常见模型分类 3.1 分类问题 3.2 优化问题 详细思路见此名片,开赛第一时间更新 1.亚太地区数学建模ABC题思路模型:9比赛开…

使用docker搭建socks5代理

我参考MuleSoft Help Center成功搭建了socks5代理服务器 文字内容如下(怕以后访问不了) How to set up a testing SOCKS5 proxy (dante) for Anypoint monitoring in RTF (Runtime Fabric) A demonstration to set up a SockS5 proxy with Dante and se…

智能座舱架构与芯片 - (1) 背景篇

一、软件定义汽车 1.1 什么是软件定义汽车 软件定义汽车(Software Defined Vehicles, SDV)的核心思想是,决定未来汽车的是人工智能为核心的软件技术,而不再是汽车的马力大小,是否真皮座椅,机械性能的好坏。软件定义汽车的终极目…

鼎捷前端开发校招岗技术面面经(已过)

前言 鼎捷一共两面,一面针对技术,这篇博客记录下我认为有价值的问题。 有价值的提问 js类的继承的方式 es5,涉及到原型、原型链的继承; es6,类与对象,extends,super; 还问到Vue…

Lombok @With 的纯弊端及如何避免

由于是第一篇写关于 Lombok 的日志,所以有些不情愿去开门见山直接触及 With, 而要先提一提本人对 Lombok 的接触过程。 两三年之前写 Java 代码一直都是全手工打造。一个数据类,所有必须的 setter/getter, toString, hashcode() 等全体现在源代码中&…

Servlet实现一个简单的表白墙网站

文章目录 前言效果展示事前准备HTML、CSS、JavaScript分别负责哪些HTML和CSS构架出页面的基本结构和样式JavaScript 实现行为和交互实现服务器端的业务代码整理pom.xmlweb.xmlmessageWall.htmlMessageServlet.java 前言 前面我们学习了 Java 中知名的 HTTP 服务器 tomcat 的安…

SpringBoot 整合 Quartz 实现 对任务进行CRUD

前言 公司之前的项目的定时任务都是使用Schedule注解进行管理的;新需求需要实现对定时任务进行动态管理。后面决定用Quartz框架进行集成,以最小的代码来管理定时任务。 所需依赖:Springboot 1.xx 或 2.xx-RELEASE 都行, quartz 使用2.3.0版…