Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >重学数据结构(二、栈)

重学数据结构(二、栈)

作者头像
三分恶
发布于 2020-08-30 08:03:10
发布于 2020-08-30 08:03:10
37500
代码可运行
举报
文章被收录于专栏:三分恶的专栏三分恶的专栏
运行总次数:0
代码可运行

1、栈的定义和特点

栈(Stack)又称堆栈, 是限制在表的一端进行插入和删除运算的线性表。

如果要拿一个东西对比,羽毛球筒比较合适。

栈遵循后进先出( Last-in-first-out,LIFO)的原则。

比如上面的羽毛球筒,只能将最顶端的羽毛球移出,也只能将新的羽毛球放到最顶端——这两种操作分别称作入栈( Push)出栈( Pop)。入栈和出栈的示意图如下:

最顶端的羽毛球叫栈顶栈顶 (top),最底端的羽毛球称为栈底 (bottom)

2、栈的基本操作

栈的基本操作除了入栈和出栈外, 还有栈的初始化、 栈空的判定, 以及取栈顶元素等。

根据这些操作,我们定义一个接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @Author 三分恶
 * @Date 2020/8/26
 * @Description 栈接口
 */
public interface Stack {
    public int getSize();          //返回栈中元素数目
    public boolean isEmpty();      //判空
    public Object top();           //取栈顶元素但不删除
    public void push(Object element);      //入栈
    public Object pop();              //出栈
}

线性表有顺序和链式两种实现,栈同样有两种实现。

3、顺序栈

这里我们通过一个可扩容的数组来实现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @Author 三分恶
 * @Date 2020/8/26
 * @Description 顺序栈--数组实现
 */
public class ArrayStack implements Stack{

    private static  int defaultSize=15;   //默认容量
    private int size;                    //实际容量:实际存储元素个数
    private Object[] data;               //存放元素的数组

    /**
     * 无参构造方法:按默认容量构造元素数组
     */
    public ArrayStack() {
        data=new Object[defaultSize];
        size=0;
    }

    /**
     * 有参构造方法:指定元素数组容量
     * @param size
     */
    public ArrayStack(int size){
        data=new Object[size];
    }

    public int getSize() {
        return size;
    }

    public boolean isEmpty() {
        return size==0;
    }

    /**
     * 取栈顶元素:不删除栈顶元素
     * @return
     */
    public Object top() {
        if (isEmpty())
            throw new RuntimeException("栈空");
        size--;
        return data[size-1];
    }

    /**
     * 入栈
     * @param element
     */
    public void push(Object element) {
        //数组已满,扩容
         if (size==data.length){
             //扩容两倍的新数组
             Object [] newData=new Object[size<<1];
             //拷贝数组
             System.arraycopy(data,0,newData,0,size);
             data=newData;
         }
         //栈顶上插入新元素
         data[size]=element;
         size++;
    }

    /**
     * 出栈
     * @return
     */
    public Object pop() {
        if (isEmpty())
            throw new RuntimeException("栈空");
        Object top=data[size-1];
        data[size-1]=null;
        size--;
        return top;
    }
}

时间复杂度分析:

  • getSize():O(1)
  • isEmpty():O(1)
  • top():O(1)
  • push():平均O(1),最坏(扩容)O(n)
  • pop(): O(1)

3、链栈

链栈指的是链式存储结构实现的栈。在前面的学习中,我们已经完成了单向链表的实现,代码如下,具体说明可查看上一篇内容:

现在我们通过单向链表来实现链栈:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @Author 三分恶
 * @Date 2020/8/26
 * @Description
 */
public class ListStack implements Stack{
    //单向链表
    private SinglyLinkedList list;

    /**
     * 构造函数:初始化单向链表
     */
    public ListStack(){
        list=new SinglyLinkedList();
    }

    /**
     * 获取栈的容量
     * @return
     */
    public int getSize() {
        return list.getSize();
    }

    public boolean isEmpty() {
        return list.getSize()==0;
    }

    /**
     * 取栈顶元素
     * @return
     */
    public Object top() {
        //取列表的尾节点
        return list.get(list.getSize()-1);
    }

    /**
     * 入栈
     * @param element
     */
    public void push(Object element) {
        //队列尾插入
       list.addTail(element);
    }

    /**
     * 出栈
     * @return
     */
    public Object pop() {
        int topIndex=list.getSize()-1;
        //列表为节点
        Object top=list.get(topIndex);
        //删除尾结点
        list.remove(topIndex);
        return top;
    }
}

时间复杂度分析:

  • getSize():O(1)
  • isEmpty():O(1)
  • top():O(1)
  • push():O(1)
  • pop(): O(1)

4、java中的栈

Java中有一个java.util.Stack类,它实现了栈的结构。

它是Vector的子类,也自定义了一些作为栈的方法。

java.util.Stack类是Vector的子类,实际上并不建议使用它。

在Java中还有另外一个集合,可以作为栈使用,它就是LinkedList。LinkedList中实现了push、pop方法。具体可以查看LinkedList源码阅读笔记


源码地址:https://gitee.com/LaughterYoung/data-structure-learn.git

上一篇:重学数据结构(一、线性表)


本文为学习笔记类博客,主要资料来源如下!

参考:

【1】:邓俊辉 编著. 《数据结构与算法》 【2】:王世民 等编著 . 《数据结构与算法分析》 【3】: Michael T. Goodrich 等编著.《Data-Structures-and-Algorithms-in-Java-6th-Edition》 【4】:严蔚敏、吴伟民 编著 . 《数据结构》 【5】:程杰 编著 . 《大话数据结构》 【6】:Java Stack 类

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java数据结构和算法(四)——栈
根据提供的文章内容,总结了关于使用栈实现字符串逆序和分隔符匹配的要点,并返回了json格式的摘要总结。
IT可乐
2018/01/04
9080
Java数据结构和算法(四)——栈
数据结构之栈
1、栈Stack,栈也是一种线性结构,相比数组,栈对应的操作是数组的子集。栈只能从一端添加元素,也只能从同一端取出元素,这一端称为栈顶。栈是一种先进后出的或者后进先出的数据结构,也称为Last In First Out(LIFO)。
别先生
2020/03/19
5570
疯狂数据结构-栈-Java
需要注意的是,在使用栈时要避免两个常见的问题:栈上溢(stack overflow)和栈下溢(stack underflow)。栈上溢发生在尝试向已满的栈中插入元素时,而栈下溢发生在尝试从空栈中弹出元素时。
学编程的小程
2023/10/11
2810
疯狂数据结构-栈-Java
数据结构与算法(2)——栈和队列栈队列LeetCode 相关题目整理其他题目整理
栈是一种用于存储数据的简单数据结构(与链表类似)。数据入栈的次序是栈的关键。可以把一桶桶装的薯片看作是一个栈的例子,当薯片做好之后,它们会依次被添加到桶里,每一片都会是当前的最上面一片,而每次我们取的时候也是取的最上面的那一片,规定你不能破坏桶也不能把底部捅穿,所以第一个放入桶的薯片只能最后一个从桶里取出;
我没有三颗心脏
2018/07/24
1.3K0
搞定数据结构-栈和队列
如下,使用栈结构操作. “网”这个错别字在栈顶,“网”改成”望”只需要将“网”从栈顶移除重新写入”望”.
用户3045442
2019/11/06
5510
搞定数据结构-栈和队列
java数据结构之(顺序栈+链式栈)
今天介绍一下数据结构中的栈。栈实现和线性表实现差不多都是有两种实现方式,一种是顺序栈,另一种就是链式栈。
林老师带你学编程
2022/11/30
4340
线性结构之栈和队列
举个不太恰当的比喻,栈就像一个直径比乒乓球大点的水杯,而元素就像是乒乓球,现在我们要把几个乒乓球放入杯子里。因为杯子底部是实的,所以我们只能从杯口放入兵乓球,我们把乒乓球放入这个水杯的过程就是入栈,把兵乓球从杯子中取出的过程就是出栈。这个杯子的杯口就是栈顶,而在最上面的那个乒乓球就是栈顶元素。当我们想从水杯里拿乒乓球的时候,只能从最上面的开始拿,无法从底部或中间开始拿,符合后进先出的特性:
端碗吹水
2020/09/23
2900
线性结构之栈和队列
【化解数据结构】什么是栈?手写实现一个栈结构
栈是一种特殊的线性表,它可以用数组或链表来实现,通常用数组来实现,但是它和数组又很不一样。 对于数组而言,我们可以随意的从数组中取出一个元素,也可以在数组的任意位置插入一个元素。 但是对于栈结构而言,相对于数组做了一定的限制,它只允许在栈顶进行取出和插入操作 因此,栈有着先进后出的特点
小丞同学
2021/11/11
3510
【化解数据结构】什么是栈?手写实现一个栈结构
数据结构之栈
后缀表达式适合计算式进行运算,但是人却不太容易写出来,尤其是表达式很长的情况下,因此在开发中,我们需要将中缀表达式转成后缀表达式。
用户11332765
2024/10/28
790
数据结构之栈
数据结构 01
数据结构是计算机相关专业的基础课程,不管学什么编程语言,都要学习数据结构。接下来就一起来了解一下吧。
贪挽懒月
2019/02/20
7640
自己动手写数据结构之数组实现栈
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
suveng
2019/09/18
3860
自己动手写数据结构之数组实现栈
数据结构基础温故-2.栈
现实生活中的事情往往都能总结归纳成一定的数据结构,例如餐馆中餐盘的堆叠和使用,羽毛球筒里装的羽毛球等都是典型的栈结构。而在.NET中,值类型在线程栈上进行分配,引用类型在托管堆上进行分配,本文所说的“栈”正是这种数据结构。栈和队列都是常用的数据结构,它们的逻辑结构与线性表相通,不同之处则在于操作受某种特殊限制。因此,栈和队列也被称为操作受限的线性表。这里,我们首先来了解一下栈。
Edison Zhou
2018/08/20
3950
数据结构基础温故-2.栈
【数据结构与算法】栈
计算机科学中,stack 是一种线性的数据结构,只能在其一端添加数据和移除数据。习惯来说,这一端称之为栈顶,另一端不能操作数据的称之为栈底,就如同生活中的一摞书
程序员波特
2024/09/26
770
【数据结构】栈的基本实现
MaybeHC
2024/04/23
880
【数据结构】栈的基本实现
Java实现基本数据结构(二)——栈
阅读本文前,最好先学习顺序表的基本操作和实现原理,也就是弄清楚数组的原理,点击Java实现基本数据结构(一)——数组学习前置内容。学习效果更好哦!
星如月勿忘初心
2020/08/02
7620
数据结构-栈
栈(英语:stack)又称为堆栈或堆叠,栈作为一种数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。   由于堆叠数据结构只允许在一端进行操作,因而按照后进先出(LIFO, Last In First Out)的原理运作。栈也称为后进先出表
杨小杰
2019/06/03
4320
栈的数据结构
请问: 计算机底层是如何运算得到结果的? 注意不是简单的把算式列出运算,因为我们能直接看出这个算式,但是计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串),我们讨论的就是这个问题 -> 栈
乐心湖
2021/01/18
7160
栈的数据结构
Java数据结构与算法解析(二)——栈
栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶。对栈的基本操作有push(进栈)和pop(出栈),对空栈进行push和pop,一般被认为栈ADT的一个错误。当push时空间用尽是一个实现限制,而不是ADT错误。栈有时又叫做LIFO(后进先出)表。
老马的编程之旅
2022/06/22
3220
Java数据结构与算法解析(二)——栈
数据结构图文解析之:栈的简介及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 数据结构图文解析之:树的简介及二叉排序树C++模板实现. 数据结构图文解析之:AVL树详解及C++模板实现 数据结构图文解析之:二叉堆详解及C++模板实现 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现 1. 栈的简介 1.1栈的特点 栈(Stack)是一种线性存储结构,它具有如下特点: 栈中的
Tencent JCoder
2018/07/02
6680
栈(Stack) 原
栈又称堆栈,是限制在表的一端进行插入和删除运算的线性表。 表中进行插入、删除操作的一端称为栈顶(top)。 栈顶保存的元素称为栈顶元素。 表的另一端称为栈底(bottom)。 当栈中没有元素时称为空栈。 向一个栈中插入元素称为进栈或入栈或压栈(push)。插入的元素是当前最新的。 从一个栈中删除元素称为出栈或退栈或弹栈(pop)。删除的元素是当前最新的。 由于栈的插入和删除仅在栈顶进行,后进栈的元素必定先出栈,所以把堆栈称为后进先出表(Last In First Out,LIFO)。 当栈满时进栈运算称为上溢;当栈空时出栈运算称为下溢。
云飞扬
2019/03/13
7490
栈(Stack)
                                                                            原
相关推荐
Java数据结构和算法(四)——栈
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验