热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

顺序栈的基本操作_数据结构(一)栈结构

数结STRUCTUREDATA据构栈结构STACK前言在计算机中存储数据需要用到各种数据结构,一起来了解下栈结构吧。栈结构介绍在计算机的世界里经常会接触到各种数据结构
685a54ee4515ed3a03828b7fd4baf0e1.png

STRUCTURE

  DATA

栈/结/构 S/T/A/C/K

de39ac36b4d39710a09745cfc9e559f7.png

前言

在计算机中存储数据需要用到各种数据结构,一起来了解下栈结构吧。

7bb8af51804a755911be420a37d60296.png

栈结构介绍

    在计算机的世界里经常会接触到各种数据结构,例如栈、队列、链表等等。这篇文章就带大家了解一下其中之一的栈结构。

    栈结构的宗旨就是先进后出(FILO, First in Last out),即先进入栈中的元素会在最后才能弹出。栈结构用图形来表达的话就是这样:

55494e061d19e22dfba1da562cbac088.png7bb8af51804a755911be420a37d60296.png

栈结构的操作

    栈的操作有两个:“压入”和“弹出”。压入栈和弹出栈就是对应添加数据和删除数据,上一节中的栈结构的介绍即是栈的压入操作。至于为什么这样叫呢?相信你看了下面的“弹出”就会理解了。

1a4599dc0e6372451054e2b9a716e728.png

    看起来就像是从栈中弹出了有木有?“熊二”在从栈中弹出后,栈中就只剩下了“喜羊羊”。细心的小可爱可能已经发现了:栈的压入顺序是喜羊羊先进来,其次才是熊二。但是弹出的顺序是熊二先弹出。为什么喜羊羊不能先弹出?因为熊二压在它的上面,它想要弹出栈必须先把熊二弹出,如果上面有更多的元素的话,依次类推。

    这个原理就叫做“先进后出”,先进入栈的元素会被压在最下面,必须等到上面的一个个元素都弹出了,它才能弹出。

00fcf3d06f331c62783934354be689d7.png00fcf3d06f331c62783934354be689d7.png

压入、弹出操作的练习

    给大家出个题:依次向栈中压入1、2、3、4、5五个元素,然后依次弹出,弹出的顺序是什么呢?

    给大家五秒钟的时间考虑一下:

    答案:依先进后出原则,答案应该是:5、4、3、2、1。

    假如我们限制入栈顺序是5、4、3、2、1,那么下列哪种不是一个合法的出栈序列?

    A. 45123

    B. 34125

    C. 52314

    D. 12435

    大家要知道,栈并不是统一入栈,全部入完后才能出栈,而是入栈出栈的时机都可以是自定义的,只要你想,可以随时入栈和出栈。

    我们来看选项A:

    我们知道,入栈顺序是5、4、3、2、1,但是A的第一个弹出是4,那么就代表我们要在栈顶是4时进行弹出,那么前两次入栈大概是这样:

e0323b72cb5f9a95886ecb79648c9f37.png

    此时按题目要求,我们下此压入就该压入“3”了,但是选项A要求的出栈顺序是45123,第一个要弹出的元素是“4”,所以我们不能继续入栈了,要将元素“4”弹出,就像这样:

5519307a344821b16be2134daa6c59c6.png

    此时45123第一个元素4已经实现,接下来需要弹出的元素是“5”,我们发现栈顶(指在栈的顶部,随时可能被弹出的元素)正好是5,所以我们先不入栈,直接出栈,像这样:

2a65709b45fa48d098f32df73f0fdd93.png

    OK,那么接下来前两步就完成了,现在栈中已没有了数据,接下来再向栈中压入吧。

2cf9f9d48f894493fa036bc0b8de3ba2.png

    我们需要的下一个弹出元素是1,但是栈顶现在是3。所以继续压入吧。

809ad6ab7845ffab3769716df5e7b613.png

   直到压入最后一个元素1后,才可以满足45123的1的弹出。我们已经没有其他元素可以压入了,所以直接弹出:

0eb44420cf5961b646408f25297142a4.pngfa906022b3eb0aa5d057e2d35902b005.png15bab66223341381c871761fd165c538.png

    OK,此时栈中元素已全部弹出了,我们来看我们的弹出顺序:4、5、1、2、3。

   滑上去看下选项A的弹出顺序,是不是一样呢?

    这样就说明A选项的弹出顺序是可行的,只要按照我们的入栈出栈步骤就行,那么选项A符合条件。

    接下来请大家画图并思考B、C、D是否合法,并选出正确答案。

    栈结构的基本操作就讲到这了,有同学可能就要问了:这种结构限制性这么强,只能以这种方式进行元素的加入、删除,它到底有什么作用呢?敬请听下回分解(十进制转二进制的运算)。

~ THE END ~




推荐阅读
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 栈和队列的共同处和不同处
    本文主要介绍了栈和队列的共同处和不同处。栈和队列都是由几个数据特性相同的元素组成的有限序列,也就是线性表。队列是限定仅在表的一端插入元素、在另一端删除元素的线性表,遵循先进先出的原则。栈是限定仅在表尾进行插入或删除操作的线性表,遵循后进先出的原则。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了栈和队列的区别及其特点。栈是一种先进后出的线性表,只能在表的一端进行插入和删除操作;队列是一种先进先出的线性表,只能在表的一端进行插入和在另一端进行删除操作。栈和队列是两种广泛使用的线性数据结构,它们的基本操作具有特殊性。栈的遍历需要遍历整个栈才能取出数据,并需要为数据开辟临时空间,而队列基于地址指针进行遍历,可以从头或尾部开始遍历,但不能同时遍历,且无需开辟临时空间。栈和队列在程序设计中具有重要应用。 ... [详细]
  • Linux的uucico命令使用方法及工作模式介绍
    本文介绍了Linux的uucico命令的使用方法和工作模式,包括主动模式和附属模式。uucico是用来处理uucp或uux送到队列的文件传输工具,具有操作简单快捷、实用性强的特点。文章还介绍了uucico命令的参数及其说明,包括-c或--quiet、-C或--ifwork、-D或--nodetach、-e或--loop、-f或--force、-i或--stdin、-I--config、-l或--prompt等。通过本文的学习,读者可以更好地掌握Linux的uucico命令的使用方法。 ... [详细]
author-avatar
地平线1232502881827
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有