栈和队列:栈

栈的概念:

栈:

一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。

栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

  • 入栈:栈的插入操作叫做 进栈/压栈/入栈,进入数据在栈顶 。
  • 出栈:栈的删除操作叫做出栈。出数据也在栈顶。

后进先出:

入栈和出栈遵循后进先出原则,即处在栈顶的数据先出栈,不处在栈顶的数据不能出栈,简单来说,就是只有处在栈顶的数据才能出栈。

                                             

数据模型的转化:

栈分为两种,一种是数组栈,另一种是链式栈,且注意,栈是不分头尾概念的,只分栈顶和栈底 

数组栈:

对于数组栈,数组的本质是顺序表,如果需要实现数组栈,则相当于实现顺序表。

且因为栈只分栈顶和栈底,又因为顺序表的尾插操作和尾删操作和其他插入删除操作更为便捷,于是选择顺序表的左边为栈底,顺序表的右侧为栈顶。 

链式栈: 

对于链式栈,其实就是链表结构的栈,而链表结构的栈分为两种,一种是双向链表,另一种是单链表。

双向链表栈:
  • 双链表具有指向前一个节点的前驱指针和指向后一个节点的后继指针,所以对于栈顶和栈底的划分并不是非常的重要。 
  • 且如若栈的数量过多,指针也的过多,会导致一定的浪费,所以双向链表模式的栈并不常用。 
单链表栈:

对于单链表而言,如果栈顶是尾节点,那么进行出栈就是尾删,但是单链表的尾删十分麻烦,需要头节点进行遍历。

于是便将单链表的栈顶变为头节点,栈底变为尾节点 

比较:在链式和数组栈中,最佳的是数组栈,虽然偶尔需要扩容。  

数组栈的实现:

从前文得知,数组栈的本质是顺序表,且因为栈是只能从栈顶进行出入,所以数组栈其实就是拥有尾删、尾插、初始化、销毁功能的顺序表。

顺序表:顺序表的简单介绍_明 日 香的博客-CSDN博客 

关于top:

  • 对于栈的结构体内部,一切都与顺序表的内部十分的相似,不论是存储 栈的地址 a ,还是表示栈的空间大小的capacity 。
  • 当然,top 并不是和顺序表中的size 一样表示有效个数的大小。

 top 可以有两种表示,一种是表示为栈顶的位置,另一种是表示为栈顶的后面一个元素的位置。

第一种:表示栈顶位置

如果top表示为栈顶的位置,那么在进行初始化的时候,top就不能设置为 top==0

  • 0表示数组的下标。

假设,top == 0 而 top 又定义为栈顶所在的位置那么根据我们的初始化,最初的数组栈是没有栈存在的。

而top 又在下标为0的位置,但是,当我们入栈后,栈顶和栈底都在下标为0的位置。

于是,这就产生了冲突,因为当没有任何栈存在时,top在0的位置,但是当进入一个栈后,top还在0的位置。

那么,top == 0 时,究竟有没有栈的存在呢?这就像薛定谔的猫一样,存在异议。 

  • 所以,面对这种问题,如果需要将top定义为栈底的位置,那么我们就需要将top的初始值设定为 top == -1

第二种:表示栈顶后的下一个位置。

如果top表示的是 栈顶的下一个位置,那么在初始化时,top==0 可以表示为下一个栈入栈后,栈顶的位置处在下标为0的位置。


 关于扩容: 

数组栈扩容的原因和顺序表一样,空间的不足需要进行扩容,且因为需要连续的数组,所以当所处的空间不能满足扩容后连续的条件,会进行复制数据转移到新的空间足够,且能连续的空间中。

  • 而对于扩容而言,top 也与扩容有着重要的关系。

如果初始化中,top == 0 那么我们需要扩容空间的条件则是 top  == capacity 

  • 也就是,栈顶 的下一个位置的下标等于当前空间的大小时,则表明我们需要进行扩容。

因为 top == 0 表示的意思是下一个入栈的节点 的下标是0 ,又因为数组的下标是从0开始的,所以得出结论,如果空间满了,栈顶因为下标的缘故,栈顶所处在的下标数字比空间大小小一,但空间确是满的!

那么栈顶所处的位置如果下一个位置的下标和空间大小一样,则表明当前空间不够了!

与之相反,如果top == -1 ,则需要top+1才能满足以上的条件。


 入栈(尾插):

和顺序表一样,在top的位置插入数据——注意这里的top 表示栈顶的下一个位置下标。 


 出栈(尾删): 

和顺序表的尾删一样,只需要让栈顶减一即可。

同时,出栈的前提是需要有栈的存在,如果top ==0或则top<0 都表示,当前是没有栈存在的,因为top == 0是下一个栈的下标是0,所以top==0是没有栈,而top也是如此,表示的是当前的栈顶是-1负数,表明了没有栈存在。


 获取栈顶元素:

初始化 top==0 ,top表示为栈顶后一个位置下标时写法: 



  

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

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

相关文章

Antd G6实现自定义工具栏

在使用g6实现知识图谱可视化中&#xff0c;产品经理提出了有关图谱操作的不少功能&#xff0c;需要放置在工具栏中&#xff0c;其中有些功能不在g6自带的功能里&#xff0c;且工具栏样式、交互效果也和官方自定义工具栏不同。那我们怎么去实现呢&#xff1f; g6官方的工具栏案例…

excel如何加密(excel加密的三种方法)

Excel是一款广泛使用的办公软件&#xff0c;有时候我们需要对一些重要的Excel文件进行加密&#xff0c;以保证文件的安全性。下面将介绍3种常用的Excel加密方法。 方法一&#xff1a;通过路径文件-另存为-工具-常规选项-设置打开或修改权限密码&#xff08;密码只可以使数字、字…

从0开始python学习-34.pytest常用插件

目录 1. pytest-html&#xff1a;生成HTML测试报告 2.pytest-xdist&#xff1a;并发执行用例 3. pytest-order&#xff1a;自定义用例的执行顺序 4. pytest-rerunfailures&#xff1a;用例失败时自动重试 5. pytest-result-log:用例执行结果记录到日志文件 1. pytest-html…

Nacos热更新

Nacos热更新 相比其他注册中心&#xff0c;Nacos的优势之一在于热更新。 热更新&#xff0c;就是不需要重启服务&#xff0c;就能够更新配置。 nacos配置中心 首先&#xff0c;需要搭建 Nacos&#xff0c;详情见&#xff1a; https://www.cnblogs.com/expiator/p/17392549.h…

Docker本地部署Drupal并实现公网访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

数据管理系统-week1-文件系统、数据库和数据库管理系统

文章目录 前言一、 文件系统文件系统的限制 二、 数据库系统三、 数据库管理系统参考文献 前言 一、 文件系统 对于更高级的数据处理应用程序来说&#xff0c;基于数据块的持久存储逻辑模型过于简单数据块序列被划分为称为文件的数据块的可变子序列&#xff0c;与文件相关的名…

键盘打字盲打练习系列之认识键盘——0

一.欢迎来到我的酒馆 盲打&#xff0c;yyds&#xff01; 目录 一.欢迎来到我的酒馆二.键盘规格三.键盘分区 二.键盘规格 经常看视频&#xff0c;看到别人在键盘上一通干净利索的操作&#xff0c;就打出想要的文字。心里突然来一句&#xff1a;卧槽&#xff0c;打字贼快啊&#…

pytest全局变量的使用

这里重新阐述下PageObject设计模式&#xff1a; PageObject设计模式是selenium自动化最成熟&#xff0c;最受欢迎的一种模式&#xff0c;这里用pytest同样适用 这里直接提供代码&#xff1a; 全局变量 conftest.py """ conftest.py 全局变量&#xff0c;主要实…

AI:76-基于机器学习的智能城市交通管理

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

asp.net外卖网站系统VS开发mysql数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net外卖网站系统 是一套完善的web设计管理系统&#xff0c;系统采用mvc模式&#xff08;BLLDALENTITY&#xff09;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为mysql&#xff0c;使用c#语…

【Unity之UI编程】玩法面板的实现

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;UI_…

Spring Cloud和Kubernetes + Spring Boot 用哪个?

Spring Cloud和Kubernetes Spring Boot都是用于构建微服务架构的解决方案&#xff0c;它们各有优势和不足&#xff0c;选择哪个更好取决于你的具体需求和上下文。 Spring Cloud是一个基于Spring Boot的微服务开发框架&#xff0c;它提供了一套完整的微服务解决方案&#xff0…

OpenMMlab导出yolov3的onnx模型并推理

手动导出 直接使用脚本 import torch from mmdet.apis import init_detector, inference_detectorconfig_file ./configs/yolo/yolov3_mobilenetv2_8xb24-ms-416-300e_coco.py checkpoint_file yolov3_mobilenetv2_mstrain-416_300e_coco_20210718_010823-f68a07b3.pth mod…

Django(复习篇)

项目创建 1. 虚拟环境 python -m venv my_env ​ cd my_env activate/deactivate ​ pip install django ​2. 项目和app创建 cd mypros django-admin startproject Pro1 django-admin startapp app1 ​3. settings配置INSTALLED_APPS【app1"】TEMPLATES【 DIRS: [os.pat…

JavaEE初阶学习:Linux 基本使用和 web 程序部署

1.Linux的基本认识 Linux 是一个操作系统.(搞管理的系统) 和Windows都是同类产品~~ Linux 实际的场景: 1.服务器 2.嵌入式设备 3.移动端(手机)Android 其实就是Linux 1991年,还在读大学的 芬兰人 Linus Benedict Torvalds,搞了一个Linux 这样的系统0.01版,正式发布了~ 后…

数据结构-双向链表

目录 1.带头双向循环链表&#xff1a; 2. 带头双向循环链表的实现&#xff1a; 双向链表初始化&#xff1a; 双向链表打印&#xff1a; 开辟节点函数&#xff1a; 双向链表头插&#xff1a; 双向链表尾插&#xff1a; 双向链表头删&#xff1a; 双向链表尾删&#xff…

指标体系:洞察变化的原因

一、指标概述 指标体系是指根据运营目标&#xff0c;整理出可以正确和准确反映业务运营特点的多个指标&#xff0c;并根据指标间的联系形成有机组合。 指标体系业务意义极强&#xff0c;所有指标体系都是为特定的业务经营目的而设计的。指标体系的设计应服从于这种目的&#x…

【数据结构】二叉树经典例题---<你真的掌握二叉树了吗?>(第一弹)

一、已知一颗二叉树如下图&#xff0c;试求&#xff1a; (1)该二叉树前序、中序和后序遍历的结果。 (2)该二叉树是否为满二叉树&#xff1f;是否为完全二叉树&#xff1f; (3)将它转换成对应的树或森林。 (4)这颗二叉树的深度为多少? (5)试对该二叉树进行前序线索化。 (6)试对…

算法之双指针

双指针算法的作用 双指针算法是一种使用2个变量对线性结构(逻辑线性/物理线性)&#xff0c;进行操作的算法&#xff0c;双指针可以对线性结构进行时间复杂度优化&#xff0c;可以对空间进行记忆。 双指针算法的分类 1.快慢指针 2.滑动窗口 3.左右指针 4.前后指针 双指针OJ题目…

docker可视化

什么是portainer&#xff1f; portainer就是docker图形化界面的管理工具&#xff0c;提供一个后台面板供我们操作 目前先用portainer(先用这个)&#xff0c;以后还会用到Rancher(CI/CD在用) 1.下载portainer 9000是内网端口&#xff0c;8088是外网访问端口 docker run…