什么是栈?

article/2025/8/16 11:19:28

本文将介绍一个重要的数据结构—栈,和之前讲到的链表、数组一样也是一种数据呈线性排列的数据结构,不过在这种结构中,我们只能访问最新添加的数据。栈就像是一摞书,拿到新书时我们会把它放在书堆的最上面,取书时也只能从最上面的新书开始取。

如上就是栈的概念图,现在存储在栈中的只有数据 Blue。往栈中添加数据的时候,新数据被放在最上面。

然后,我们往栈中添加了数据 Green。往栈中添加数据的操作叫作入栈

接下来,数据 Red 入栈。

从栈中取出数据时,是从最上面,也就是最新的数据开始取出的,即 Red。从栈中取出数据的操作叫作出栈

如果再进行一次出栈操作,取出的就是 Green 了。

像栈这种最后添加的数据最先被取出,即后进先出的结构,我们称为 Last In First Out,简称 LIFO

与链表和数组一样,栈的数据也是线性排列,但在栈中,添加和删除数据的操作只能在一端进行,访问数据也只能访问到顶端的数据,想要访问中间的数据时,就必须通过出栈操作将目标数据移到栈顶才行。

介绍完栈的基本知识后,接下来举一个例子,比如大家正在看公众号文章,那我就拿微信的订阅号为例。

如何理解栈?

首先你打开订阅号,是一个公众号列表,之后你点击了一个公众号-武培轩,进入了相应的文章列表界面,之后你点击了文章-什么是数组?,进入了文章详情页面。

好了,现在你想返回订阅号怎么办呢?向右滑两次吧,第一次回到文章列表界面,第二次回到订阅号界面。

这时候你就发现了,这些界面的储存结构可以说是一个栈结构,你打开文章详情页面,必须经过两次入栈才能达到,你想回到订阅号界面(位于栈底),必须经历两次出栈把前面两个界面移除。

栈的实现

看到这里,相信你已经对栈有了初步的理解,栈主要包含两个操作,入栈和出栈,也就是在栈顶插入一个数据和从栈顶删除一个数据。光理解还不够,我们还要动手去实现栈,接下来让我们来看一看如何用代码实现一个栈。

栈有两种存储结构,即顺序存储链式存储,也就是说栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈

首先来看下用数组实现的栈是怎么样的,其实现如下图所示:

顺序栈

那么我先用 Java 语言来实现下顺序栈,代码如下:

/*** 基于数组实现的顺序栈** @author wupx* @date 2020/02/11*/
public class ArrayStack {/*** 数组*/private String[] items;/*** 栈中元素个数*/private int count;/*** 栈的大小*/private int n;/*** 初始化数组,申请一个大小为 n 的数组空间** @param n*/public ArrayStack(int n) {this.items = new String[n];this.n = n;this.count = 0;}/*** 入栈** @param item* @return*/public boolean push(String item) {// 数组空间不够了,直接返回 false,入栈失败。if (count == n) {return false;}// 将 item 放到下标为 count 的位置,并且 count 加一items[count] = item;++count;return true;}/*** 出栈** @return*/public String pop() {// 栈为空,则直接返回 nullif (count == 0) {return null;}// 返回下标为 count-1 的数组元素,并且栈中元素个数 count 减一String tmp = items[count - 1];--count;return tmp;}
}

另外一种就是链式栈,它的实现如下图所示:

链式栈

再用链表去实现栈,代码如下:

/*** 基于链表实现的链式栈** @author wupx* @date 2020/02/11*/
public class LinkedListStack {private Node top = null;/*** 入栈** @param value*/public void push(int value) {Node newNode = new Node(value, null);// 判断是否栈空if (top != null) {newNode.next = top;}top = newNode;}/*** 出栈** @return*/public int pop() {if (top == null) {// -1 表示栈中没有数据return -1;}int value = top.data;top = top.next;return value;}public void printAll() {Node p = top;while (p != null) {System.out.print(p.data + " ");p = p.next;}System.out.println();}private static class Node {private int data;private Node next;public Node(int data, Node next) {this.data = data;this.next = next;}public int getData() {return data;}}
}

在对栈有了更深一步的理解和实践后,让我们来看下它的空间、时间复杂度各是多少呢?

不管是顺序栈还是链式栈,我们存储数据只需要一个大小为 n 的数组就够了。在入栈和出栈过程中,只需要一两个临时变量存储空间,所以空间复杂度是 O(1)

入栈和出栈只会影响到最后一个元素,不涉及其他元素的整体移动,所以无论是以数组还是以链表实现,入栈、出栈的时间复杂度都是 O(1)

总结

看完之后,相信大家都对栈有了一定的了解,让我们总结下这篇文章的内容,栈是一种线性逻辑结构,只支持入栈和出栈操作,遵循后进先出的原则(FILO)。栈既可以通过数组实现,也可以通过链表来实现,不管基于数组还是链表,入栈、出栈的时间复杂度都为 O(1)。

参考

《我的第一本算法书》

《算法图解》


http://chatgpt.dhexx.cn/article/0dMMyNbK.shtml

相关文章

【图解数据结构】栈全面总结

目录 一、前言 二、基本概念 三、栈的表示和实现 1.顺序栈 2.链栈 四、栈的常见算法实现 1.初始化 2.判空 3.判满 4.顺序栈取栈顶元素 5.顺序栈入栈 6.顺序栈出栈 五、双栈 1.双端顺序栈进栈操作 2.双端顺序栈出栈操作 六、栈的应用举例 1.回文游戏 2.多进制…

数据结构——栈

栈和队列 栈和队列介绍特点栈、队列与一般线性表的区别栈——stack栈的基本运算栈的存储结构顺序栈链栈 栈的应用 栈和队列 介绍 栈和队列是在软件设计中常用的两种数据结构,它们的逻辑结构和线性表相同 特点 栈和队列在运算上受到了限制:栈是按照“…

遥感影像百分比线性拉伸

AI Earth地球科学云平台开发者模式提供了丰富的遥感数据和函数计算能力,下面介绍结合AIE Notebook,实现遥感数据的百分比线性灰度拉伸。 本期开发者实践案例——遥感影像百分比线性拉伸 灰度拉伸 (GrayScale Stretch) 是遥感影像处理过程中的重要步骤&…

遥感影像分类方法

最初的遥感影像分类是通过目视解译(濮静娟, 1984)来完成的,对研究人员的主观意识有较强的依赖性,而且效率较低,适用于数据量较小的情况,通常作为其他方法对比的对象。目前的遥感图像分类主要以计算机分类为主,因此按照…

遥感影像配准

文章目录 前言步骤1.ENVI:打开Image Registration Workflow2.Image Registration Workflow(1)选择GF2为Base Image File,某季节Sentinel2为Warp,然后Next(2)修改该参数为100(3)人为选择5个左右控制点,然后Next(4)删除离谱点(5)在E…

遥感图像分类技术

什么是遥感图像分类技术? 图像分类是将土地覆盖类别分配给像素的过程。例如,这9个全球土地覆盖数据集将图像分为森林、城市、农业和其他类别。 https://gisgeography.com/free-global-land-cover-land-use-data/ 一般来说,这是遥感中的三种主…

遥感图像分类

遥感图像分类 一、背景简介 遥感图像分类就是利用计算机通过对遥感图像中各类地物的光谱信息和空间信息进行分析,选择特征,将图像中各个像元按照某种规则或算法划分不同的类别,然后获得遥感图像中与实际地物的对应信息,从而实现…

WorldView卫星遥感影像数据/米级分辨率遥感影像

数据样例:百度云下载链接:https://pan.baidu.com/s/17ofPwpDM3OCHnE-LuhvUp 提取码:i0m4 目前世界上最常用的高分辨率卫星影像莫过于WORLDVIEW系列了,在卫星遥感圈内可谓大名鼎鼎,不仅具有超高的分辨率还具有其他高分…

遥感数据下载平台汇总

1中国资源卫星应用中心http://www.cresda.com.cn中巴卫星、HJ星、ZY系列 、GF系列2中科院对地观测与数字地球科学中心http://ids.ceode.ac.cn/Index.aspxERS卫星,Enviset_1卫星,法国的spot4卫星,中巴资源卫星,landset-5-73地球系统…

遥感多光谱数据下载与预处理(一、数据选择 下载)

首先说明本人并非专业大牛,不是教程贴只是记录一下学习过程和大家交流,过程有不严谨不合规范不对的地方欢迎各位大神指正。 本人目前做过接触过最多的是多光谱遥感数据,也是与无人机、雷达、高光谱等相比最简单的一种,这是我自己总…

地理空间数据云下载遥感影像

目录 1、先上网址:www.gscloud.cn 2、介绍界面: 2.1 “数据资源” 2.2 “高级检索” 1、先上网址:www.gscloud.cn 2、介绍界面: 地理空间数据云,作为国内免费下载遥感卫星影像的一个大平台,随着年代发…

遥感图像入门

遥感图像入门 一、 遥感基本概念地物光谱特性3S 技术瑞利散射大气窗口 二、 遥感系统的组成三、 遥感分类四、 遥感数字图像处理图像与数字图像数字图像获取时的基本参数数字图像类型 一、 遥感基本概念 遥感(Remote Sensing)——遥远的感知,在未接触物体的情况下获…

遥感影像的几何校正

一、引言(INTRODUCTION) 图像校正主要是指辐射校正和几何校正。辐射校正包括传感器的辐射校正、大气校正、照度校正遗迹条纹和斑点的判定和消除。几何校正就是校正成像过程中造成的各种几何畸变,包括几何粗校正和几何精校正。几何粗校正是针对…

遥感影像数据下载网站整理

遥感影像数据下载网站整理 1 遥感影像数据1.1 综合遥感数据1.1.1 USGS EarthExplore1.1.2 LAADS DAAC1.1.3 Copernicus Open Access Hub1.1.4 GloVis1.1.5 地理空间数据云 1.2 雷达遥感数据1.2.1 ASF DAAC 1.3 夜光遥感数据1.3.1 NOAA EOG1.3.2 珞珈一号 1.4 海洋卫星数据1.4.1…

高分GF与环境HJ系列国产卫星遥感影像数据图像免费批量下载方法

本文介绍高分(GF)与环境(HJ)等主要国产卫星遥感数据的免费下载(包括批量下载)方法。 首先,进入中国资源卫星应用中心官网:http://www.cresda.com/CN/。选择“查询系统”。 随后登录系…

【随笔】那些免费友好的遥感影像数据下载网站

1 .影像数据 1.1 地理空间数据云 推荐指数:❤❤❤❤❤交互界面:友好传输速度:0.4m/s数据集:开源数据集较为丰富,Landsat系列数据及DEM数据较丰富,但也有一些数据无法下载。 网址:地理空间数据…

完全免费的在线遥感影像下载器-转载

链接:link 转载学习使用,可免费下载!

常用遥感数据下载平台

国内常用卫星数据下载网站 1,AI Earth 地球科学云平台 网址:AI Earth 数据:Landsat、Sentinel、MODIS、地形数据。 2,地理空间数据云 网址:http://www.gscloud.cn/ 数据:多种卫星数据 3,中…

Landsat遥感影像下载

摘要:本篇文章主要介绍下载遥感卫星影像数据常用的几种的获取方法。适合刚接触遥感这个领域不久却需要下载和使用遥感影像的人群。 本文着重介绍陆地资源卫星Landsat系列卫星的遥感影像查询和下载。 目录 1、陆地资源卫星Landsat系列卫星基本介绍 1.1 Landsat-5介绍…

遥感图像下载指南

文章目录 1、高分系列(收费)1.1 下载方式(1):登录中国资源卫星应用中心1.2 下载方式(2):登录数据分发系统 2、GOCI图像下载说明(免费),登录韩国海洋卫星中心3、MODIS图像下载4 、附录…