数据结构-03-栈

1-栈的结构和特点

先进后出,后进先出 是栈的特点;

       从图中,我们看到A入栈先放入底部,然后依次B和C;出栈的顺序依次是C-B-A;这种结构只能在一端操作。所以当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出(last-in-first-out(LIFO) )、先进后出的特性,我们就应该首选“栈”这种数据结构

2-栈的实现

我们可以使用数组和链表来实现栈,下面我们基于数组来现实一个基础功能的栈。

@Getter
@Setter
public class MyArrayStack {private Object[] elementData;//存储元素的数组private int elementCount;//元素的个数private int capacity;//容量public MyArrayStack(int capacity) {this.elementData = new Object[capacity];this.capacity = capacity;this.elementCount = 0;}// 入栈操作public boolean push(Objectitem) {if (elementCount == capacity) return false;elementData[elementCount] = item;++elementCount;return true;}// 出栈操作public Object pop() {if (elementCount == 0) return null;Object tmp = elementData[elementCount-1];--elementCount;return tmp;}
}@Slf4j
public class TestStack {public static void main(String[] args) {MyArrayStack stack=new MyArrayStack(3);log.info("push1={}",stack.push("hello"));log.info("push2={}",stack.push("java"));log.info("push3={}",stack.push("world"));log.info("push4={}",stack.push("china"));log.info("pop1={}",stack.pop());log.info("pop2={}",stack.pop());log.info("pop3={}",stack.pop());log.info("pop4={}",stack.pop());}
}

控制台输出:

10:19:38.417 [main] INFO  c.y.d.statck.TestStack - push1=true
10:19:38.423 [main] INFO  c.y.d.statck.TestStack - push2=true
10:19:38.423 [main] INFO  c.y.d.statck.TestStack - push3=true
10:19:38.424 [main] INFO  c.y.d.statck.TestStack - push4=false
10:19:38.424 [main] INFO  c.y.d.statck.TestStack - pop1=world
10:19:38.424 [main] INFO  c.y.d.statck.TestStack - pop2=java
10:19:38.424 [main] INFO  c.y.d.statck.TestStack - pop3=hello
10:19:38.424 [main] INFO  c.y.d.statck.TestStack - pop4=null

当然上面代码是简易的栈实现:还有优化的空间,比如支持泛型,支持扩容等功能;可以自行实现。

入栈、出栈只涉及栈顶个别数据的操作,所以时间复杂度都是O(1)

如何基于数组实现一个可以支持动态扩容的栈呢?当数组空间不够时,我们就重新申请一块更大的内存,将原来数组中数据统统拷贝过去。这样就实现了一个支持动态扩容的数组。Java中也有栈Stack实现的代码(支持泛型和扩容)。

3-栈的使用LeetCode

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 第20题,判断有效括号就可以使用栈这种结构来解决。

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

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

相关文章

数据治理的具体应用

数据治理架构 图 13 描述的是公安数据治理框架,平台架构主要包括数据存储、数据计算、数据管理、数据应用这 4 个部分。 (1) 数据存储: 基于分布式的大数据存储平台,具有很强的存储能力和扩张能力; (2) 数据计算: …

小语种翻译重要吗,如何做好小语种翻译

随着全球化不断推进,不同语言之间的交流日益密切,小语种翻译的重要性日益凸显。小语种翻译不仅有助于人们更好地相互理解与沟通,更能促进不同文化之间的交流与融合,做好小语种翻译至关重要。那么,如何做好小语种翻译呢…

mysql mybatis分页查询 大数据量 非常慢

查阅了很多博客和资料,这篇文章以思路为准,详细代码不细说,都是非常简单的方法,一看就明白。具体实现稍微百度一下就能出来。仅供参考。 如题:单表数据已经达到4千万条数据,通过mybatis的分页查询效率非常低…

同为科技(TOWE)品字型服务器自锁防脱扣电源线产品的应用

AC电源延长线,在数据中心机房中经常见到,机柜服务器是一组庞大的管理网络资源的计算机群,需要电源供电才能正常工作,因此,服务器电源线是连接电源分配器和服务器的基本配件。如果我们仔细观察服务器,就会发…

CMD命令切换至D盘

1.使用快捷键winr进入如下所示界面: 2.在框内输入CMD 后点击确定,即可进入如下界面; 3.输入d: 后按下enter即可转换成功; 补充一些CMD命令: 1. appwiz.cpl:程序和功能 2. calc:启动计算器 3.…

极兔快递查询入口,筛选出指定派件员的单号

批量查询极兔快递单号的物流信息,将指定派件员的单号筛选出来。 所需工具: 一个【快递批量查询高手】软件 极兔快递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,并登录 步骤2:点击主界面左上…

SAP BW层级结构小结属性数据源+专家例程实现层级结构增强加载

作者 idan lian 如需转载备注出处 BW信息对象-层级结构 RSH1 维护信息对象层级 这里的文本描述对应T表中的描述,文本数据源加载之后有数据 信息对象层级H表 以上描述都是根据自我理解翻译的,非官方翻译 层级标识:自动生成,其实…

力扣283题 移动零 双指针解法

移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出…

STC15-串口通信打印输出数据printf函数与sprintf函数

STC15-串口通信打印输出数据printf函数与sprintf函数 1.打印输出数据有二种printf函数与sprintf函数,不同之处有:(1)函数的声明不同(2)函数的功能不同(3)用法举例 该问题引用百度知道…

【JavaScript】3.2 JavaScript性能优化

文章目录 1. 避免全局查找2. 避免不必要的属性查找3. 使用快速的JavaScript方法4. 避免不必要的DOM操作5. 使用Web Workers进行后台处理总结 性能优化是任何编程语言的重要组成部分,JavaScript也不例外。在这个章节中,我们将探讨如何优化JavaScript代码&…

万字解析设计模式之策略模式、命令模式

一、策略模式 1.1概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 策略模式(Strategy Pattern)是一个行为型设计模式,它定义了一组算法家族,分…

【SpringBoot系列】SpringBoot时间字段格式化

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…