当前位置: 首页 > news >正文

【初阶数据结构】深入解析栈:探索底层逻辑

在这里插入图片描述

🔥引言

本篇将深入解析栈:探索底层逻辑,理解底层是如何实现并了解该接口实现的优缺点,以便于我们在编写程序灵活地使用该数据结构。

请添加图片描述
Alt

🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记
🌈初阶数据结构笔记专栏: 初阶数据结构笔记

🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
请添加图片描述

文章目录

  • 一、栈的概念及结构
  • 二、关于实现栈的分析
  • 三、实现栈的相关接口(Satck.h)
    • 3.1 关于top的定义
    • 3.2 栈的初始化
    • 3.3 入栈操作
    • 3.4 出栈操作
    • 3.5 得到栈顶元素
    • 3.6 得到栈里面元素个数
    • 3.7 判断栈是否为空
    • 3.8 栈的打印
    • 3.9 栈的销毁

一、栈的概念及结构

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

这里主要分享的是跟数据结构相关的栈,而不是指存储内存一块内存区域栈区,栈区是指CPU寄存器里的某个指针所指向的一片内存区域(存放函数的参数值,局部变量的值等)

其中有两个核心操作压栈和出栈(出入数据在栈顶实现)

  • 压栈:栈的插入操作叫做进栈/压栈/入栈。入数据在栈顶

  • 出栈:栈的删除操作叫做出栈。出数据也在栈顶。
    在这里插入图片描述

在这里插入图片描述

由于栈的特殊结构特性,所以出栈有多种方式,而入栈只有一种

2.一个栈的入栈序列为ABCDE,则不可能的出栈序列为( )
A.ABCDE
B.EDCBA
C.DCEBA
D.ECDBA
答案:D

二、关于实现栈的分析

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。在顺序表章节,说明了静态顺序表的实用价值不大,通常是使用动态,这里实现栈的也是是实现动态栈

在这里插入图片描述

三、实现栈的相关接口(Satck.h)

在这里插入图片描述

3.1 关于top的定义

在实现之前,对top需要有一个定义。当对栈顶元素修改的时候,top作为一个下标。既然top是一个下标,**那么top为0是代表栈为空还是栈存储一个元素,这个是需要我们去定义的(**在顺序表中,也是需要定义的)。所以栈有两种关于栈顶的定义。

  • top为-1代表空,top为0代表一个元素

  • top为0代表空,top指向下一个元素下标

其实上面的两种方式都可以的,在插入过程顺序会出现差异

在这里插入图片描述

下列的实现都是采用第二种top为0代表空,top指向下一个元素下标

3.2 栈的初始化

void STInit(ST *pst)
{assert(pst);//指向一个有效的结构体pst->a = NULL;pst->top =pst->capacity= 0;
}

3.3 入栈操作

void STPush(ST* pst, StackDataType x)
{assert(pst);if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;StackDataType *tmp = (StackDataType*)realloc(pst->a, sizeof(StackDataType)*newcapacity);if (tmp==NULL){perror("realloc fail!!!");return 1;}pst->capacity = newcapacity;pst->a = tmp;//保证安全返回}pst->a[pst->top] = x;//插入 pst->top++;//注意top的意义--之后里面为1没有给数值
}

这里需要注意的是:这里插入就是相当于顺序表的尾插,只有栈顶进行插入,所以没有必要单独实现扩容接口,直接在插入时需要空间进行扩容操作

3.4 出栈操作

void STPop(ST* pst)//跳出
{assert(pst);assert(pst->top > 0);//top为0,则是为空pst->top--;//元素个数--
}

这里需要注意的是:相当于顺序表的尾删,同时要满足保证有数据给你删除

在这里插入图片描述

3.5 得到栈顶元素

StackDataType STTOP(ST* pst)//得到栈顶元素
{assert(pst);return pst->a[pst->top-1];//这里减的话就会有问题
}

这里需要注意的是:这里top是指向下一个元素的下标,需要-1到达栈顶元素下标

3.6 得到栈里面元素个数

int STSize(ST* pst)
{return pst->top;//个数
}

3.7 判断栈是否为空

bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;//为0就是空,为真
}

3.8 栈的打印

void STPrintf(ST* pst)
{while(!STEmpty(pst)){printf("%d", STTOP(pst));STPop(pst);printf("\n");}
}

这里需要注意的是:打印是打印栈顶元素,为了下次打印,需要出栈得到新栈顶元素。当栈里面没有数据时,就不要再打印数据,没有数据打印。

3.9 栈的销毁

void STDestroy(ST* pst)//销毁
{assert(pst);free(pst->a);pst->a = NULL;pst->top =pst->capacity = 0;
}

请添加图片描述

以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二初阶数据结构笔记,希望对你在学习初阶数据结构中有所帮助!

相关文章:

  • 计算机网络面试HTTP篇二
  • 北京互联网企业出海服务小程序开发的主要功能
  • ReactNative进阶(二十八)Metro
  • 对称/非对称加密
  • 解决Microsoft Edge浏览器无法使用英文翻译功能
  • 定个小目标之刷LeetCode热题(28)
  • 孕妈妈如何高效备考PMP,纯经验分享
  • Vue核心指令解析:探索MVVM与数据操作之美
  • SpringBoo+vue3+vite整合讯飞星火3.5通过webscoket实现聊天功能(前端代码)附带展示效果
  • Python爬虫-贝壳新房
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • 在线随机密码生成工具
  • 制作微信小程序“飞翔的小鸟”
  • 【Redis】如何保证缓存和数据库的一致性
  • Vue发送http请求
  • 自己简单写的 事件订阅机制
  • 2017前端实习生面试总结
  • Apache Spark Streaming 使用实例
  • Bootstrap JS插件Alert源码分析
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • yii2中session跨域名的问题
  • 从零开始在ubuntu上搭建node开发环境
  • 区块链共识机制优缺点对比都是什么
  • 如何设计一个比特币钱包服务
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 使用 @font-face
  • 阿里云ACE认证之理解CDN技术
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (九)信息融合方式简介
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • *1 计算机基础和操作系统基础及几大协议
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .describe() python_Python-Win32com-Excel
  • .NET 服务 ServiceController
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • /bin/bash^M: bad interpreter: No such file or directory
  • @ConfigurationProperties注解对数据的自动封装
  • @media screen 针对不同移动设备
  • [.net]官方水晶报表的使用以演示下载
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [CODE:-5504]没有[SYS.SYSOBJECTS]对象的查询权限
  • [CSS]CSS 的背景
  • [HXPCTF 2021]includer‘s revenge
  • [node]Node.js 模块系统