数据结构——栈的模拟实现

大家好,今天我要介绍一下数据结构中的一个经典结构——栈。

一:栈的介绍

与顺序表和单链表不同的是:

顺序表和单链表都可以在头部和尾部插入和删除数据,但是栈的结构就锁死了(栈的底部是堵死的)栈只能从栈顶插入(数据入栈)和删除(数据出栈)数据————last in first out(后进先出)(最后入栈的数据要第一个出栈)。

如果进栈过程中不允许出栈:入栈 1 2 3 4————出栈4 3 2 1

二:栈的概念和结构

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

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

出栈:栈的删除操作叫做出栈。出数据也在栈顶。

来看一道经典的练习题:

这道题目看到进栈顺序是1 2 3 4,很多人会直接想到出栈顺序为 4 3 2 1.

但是答案中却没有4 3 2 1 

我们仔细读题:

题目要找不可能的出栈顺序,说明四个选项中有三个选项都是可能的出栈顺序。

在进栈过程中允许出栈的前提下,一种进栈顺序是可以对应出多种出栈顺序的。

这种题目的解法就是模拟实现上面的情境,以D选项为例:

3 4 2 1的出栈顺序

可以先入1 2 3,再出3,再入4,再出4,最后出2 1.

三:栈的模拟实现

栈的结构只能从栈顶插入和删除数据(我们在实现的过程中以数组或者链表的尾部当栈顶)。(头部当栈顶的话数组就麻烦了)。

栈的模拟实现使用数组或者单链表都是可以的,相对而言数组的结构实现更优一些。因为在数组尾部插入数据的代价比较小。

链表的话在尾部插入数据如果定义一个尾指针的话还是容易做到的,但是如果链表删除尾部数据的话还是要从头指针进行遍历的(单链表不可逆)(尾指针不容易找到其前一个结点)(使用双向链表就有点麻烦了)。(要是真的愿意使用链表的方式实现也是可以的,自己下去可以尝试)。

综上:

我们今天使用数组来实现栈这一数据结构,数组的尾部作为栈顶。

0.栈的结构的定义

这里我们还是使用动态内存栈。

1.栈的初始化

栈的模拟实现实际上跟顺序表很相似,甚至比顺序表还要简单。

这里值得说明的就是:

1.在初始化的过程中先给上数组4个存储空间,后面不够的话在添加。

2.程序的第17行top的含义是指向栈顶元素的下一个位置(初始情况下栈中没有数据top的下表就先为0).(这样的话方便后续数据入栈)。

当然这里也可以让top指向栈顶元素(初始时栈中没有元素就先指向-1,栈中插入数据之后,top就是栈顶元素的下表)

两种方式都可以,看自己平时的习惯即可(你用哪种方式实现后续操作要保持一致)。

2.插入数据(数据入栈)

插入数据首先要判断空间是否够用,不够的话扩容(二倍扩容法)。

3.删除栈顶数据(数据出栈)

删除数据之前要断言是否有数据可删(否则会有越界的风险)

未完待续……

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Harmony编译与打包

1、hvigor编译脚本文件 hvigorconfig.ts:位于项目根目录,默认不存在(可以自行创建),执行的时机较早,可用于在hvigor生命周期刚开始时操作某些数据。hvigorfile.ts:项目根目录和每个模块目录下都有,在此文件中可以注册插件、任务以及生命周期hook等操作(类似Android的b…

健康的玉米叶病害数据集,玉米识别数据集,对原始图片进行yolov,coco,voc格式标注

健康的玉米叶病害数据集 对原始图片进行yolov,coco,voc格式标注,可识别玉米叶子是否健康 数据集分割 训练组100% 442图片 有效集% 0图片 测试集% 0图片 预处理 自动定向:…

MobileLLM开发安卓AI的体验

MobileLLM是一个在安卓端跑的大语言模型,关键它还有调动api的能力 https://github.com/facebookresearch/MobileLLM 项目地址是这个。 看了下,似乎还是中国人团队 article{liu2024mobilellm, title{MobileLLM: Optimizing Sub-billion Parameter Langua…

IIS部署程序https是访问出现403或ERR_HTTP2_PROTOCOL_ERROR

一、说明 在windows server 2016中的IIS程序池里部署一套系统,通过https访问站点,同时考虑到安全问题以及防攻击等行为,就用上了WAF云盾功能,能有效的抵挡部分攻击,加强网站的安全性和健壮性。 应用系统一直能够正常…

2024小迪安全信息收集第三课

目录 一、Web应用-架构分析-WAF&蜜罐识别 二、Web应用-架构分析-框架组件指纹识别 #Web架构 开源CMS 前端技术 开发语言 框架组件 Web服务器 应用服务器 数据库类型 操作系统信息 应用服务信息 CDN信息 WAF信息 蜜罐信息 其他组件信息 #指纹识别 #WAF识别…

计算机网络技术基础:3.计算机网络的拓扑结构

网络拓扑结构是指用传输媒体互连各种设备的物理布局,即用什么方式把网络中的计算机等设备连接起来。将工作站、服务站等网络设备抽象为点,称为“节点”;将通信线路抽象为线,称为“链路”。由节点和链路构成的抽象结构就是网络拓扑…

【数据结构】基数排序的原理及实现

👦个人主页:Weraphael ✍🏻作者简介:目前正在准备26考研 ✈️专栏:数据结构 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 如果文章…

opencv-python的简单练习

一、编程题 读取一张彩色图像并将其转换为灰度图。 import cv2# 读取彩色图像 image_path path_to_your_image.jpg # 替换为你的图像路径 color_image cv2.imread(image_path)# 检查图像是否成功加载 if color_image is None:print("图像加载失败,请检查图…

Python鼠标轨迹算法(游戏防检测)

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…

【USB-HID】“自动化键盘“ - 模拟键盘输入

目录 【USB-HID】"自动化键盘" - 模拟键盘输入1. 前言2. 模拟键盘2.1 STM32CubeMX 配置2.2 修改代码配置2.3 发送按键信息 3. 接收主机Setup数据3.1 获取PC下发的数据 4. 总结 【USB-HID】“自动化键盘” - 模拟键盘输入 1. 前言 对于模拟键盘的实现,网…

图-遍历(DFS+BFS)

图-遍历 1.简介2.深度优先遍历dfs3.广度优先遍历bfs4.具体问题4.1 岛屿的最大面积4.2 岛屿的数量 5.总结 1.简介 图是数据结构中的另一种数据结构,通常用来表示多对多的关系。在 C 中,图通常可以通过邻接表或邻接矩阵表示。 例如: 2.深度优…

python中向量指的是什么意思

一、向量是什么 在数学中,向量(也称为欧几里得向量、几何向量、矢量),指具有大小(magnitude)和方向的量。它可以形象化地表示为带箭头的线段。箭头所指:代表向量的方向;线段长度&am…

Vulhub:Log4j[漏洞复现]

CVE-2017-5645(Log4j反序列化) 启动靶场环境 docker-compose up -d 靶机IPV4地址 ifconfig | grep eth0 -A 5 ┌──(root㉿kali)-[/home/kali/Desktop/temp] └─# ifconfig | grep eth0 -A 5 eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 in…

[OpenGL] Transform feedback 介绍以及使用示例

一、简介 本文介绍了 OpenGL 中 Transform Feedback 方法的基本概念和代码示例。 二、Transform Feedback 介绍 1. Transform Feedback 简介 根据 OpenGL-wiki&#xff0c;Transform Feedback 是捕获由顶点处理步骤&#xff08;vertex shader 和 geometry shader&#xff0…

探秘 AI Agent 之 Coze 智能体:从简介到搭建全攻略(4/30)

一、Coze 智能体概述 &#xff08;一&#xff09;Coze 智能体是什么 Coze 智能体是基于机器学习和自然语言处理技术的软件实体&#xff0c;它在人工智能领域扮演着重要的角色&#xff0c;能够像一个智能助手一样&#xff0c;通过与外界环境进行交互学习&#xff0c;进而执行各…

游戏引擎学习第47天

仓库: https://gitee.com/mrxiao_com/2d_game 昨天我们花了一点时间来修复一个问题&#xff0c;但基本上是在修复这个问题的过程中&#xff0c;我们决定添加一个功能&#xff0c;那就是在屏幕上控制多个实体。所以如果我有一个手柄&#xff0c;我可以添加另一个角色&#xff0…

CAPL如何设置或修改CANoe TCP/IP协议栈的底层配置

在CANoe中创建网络节点作为以太网主机时,可以给其配置独立的TCP/IP Stack。 配置的协议栈有一些底层配置参数可以在界面上设置或修改,比如: MTU上图中MTU显示500只是图形界面显示错误,正确值是1500。 TCP延迟确认这些参数也可以通过CAPL动态配置,甚至CAPL还可以配置很多界…

RabbitMQ实现消息发送接收——实战篇(路由模式)

本篇博文将带领大家一起学习rabbitMQ如何进行消息发送接收&#xff0c;我也是在写项目的时候边学边写&#xff0c;有不足的地方希望在评论区留下你的建议&#xff0c;我们一起讨论学习呀~ 需求背景 先说一下我的项目需求背景&#xff0c;社区之间可以进行物资借用&#xff0c…

计算机进制的介绍

一.进制介绍 对于整数&#xff0c;有四种表示方式: 1&#xff09;二进制:0,1&#xff0c;满2进1。 在golang中&#xff0c;不能直接使用二进制来表示一个整数&#xff0c;它沿用了c的特点。 参考:Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国 //赋值…

基于卷积神经网络的Caser算法

将一段交互序列嵌入到一个以时间为纵轴的平面空间中形成“一张图”后&#xff0c;基于卷积序列嵌入的推荐&#xff08;Caser&#xff09;算法利用多个不同大小的卷积滤波器&#xff0c;来捕捉序列中物品间的点级&#xff08;point-level&#xff09;、联合的&#xff08;union-…