动图演示:手撸堆栈的两种实现方法!(三)

简介: 动图演示:手撸堆栈的两种实现方法!(三)

自定义栈II:链表实现

除了数组之外,我们可以还可使用链表来实现栈结构,它的实现稍微复杂一些,我们先来看链表本身的数据结构:

image.png

使用链表实现栈的流程如下:

image.png也就是说,入栈时我们将数据存储在链表的头部,出栈时我们从头部进行移除,并将栈顶指针指向原头部元素的下一个元素,实现代码如下。


我们先来定义一个链表节点:

public class Node {
    Object value; // 每个节点的数据
    Node next; // 下一个节点
    public Node(Object value) {
        this(value, null);
    }
    /**
     * 创建新节点
     * @param value 当前节点数据
     * @param next  指向下一个节点(头插法)
     */
    public Node(Object value, Node next) {
        this.value = value;
        this.next = next;
    }
}
接下来我们使用链表来实现一个完整的栈:
public class StackByLinked {
    private Node top = null; // 栈顶数据
    private int maxSize = 0; // 栈最大容量
    private int leng = 0; // 栈实际容量
    public StackByLinked(int initSize) throws Exception {
        if (initSize <= 0) {
            throw new Exception("栈容量不能小于等于0");
        }
        top = null;
        maxSize = initSize;
        leng = 0;
    }
    /**
     * 容量是否已满
     * @return
     */
    public boolean isFull() {
        return leng >= maxSize;
    }
    /**
     * 是否为空
     * @return
     */
    public boolean isEmpty() {
        return leng <= 0;
    }
    /**
     * 入栈
     * @param val
     * @return
     * @throws Exception
     */
    public boolean push(Object val) throws Exception {
        if (this.isFull()) {
            // 容量已满
            throw new Exception("容量已满");
        }
        top = new Node(val, top); // 存入信息,并将当前节点设置为头节点
        leng++;
        return true;
    }
    /**
     * 出栈(移除)
     * @return
     * @throws Exception
     */
    public Node pop() throws Exception {
        if (this.isEmpty()) {
            throw new Exception("栈为空,无法进行移除操作");
        }
        Node item = top; // 返回当前元素
        top = top.next;
        leng--;
        return item;
    }
    /**
     * 查询栈顶信息
     * @return
     */
    public Node peek() throws Exception {
        if (isEmpty()) {
            throw new Exception("你操作的是一个空栈");
        }
        return top;
    }
    // 代码测试
    public static void main(String[] args) throws Exception {
        StackByLinked stack = new StackByLinked(10);
        stack.push("Hello");
        stack.push("Java");
        System.out.println(stack.peek().value);
        stack.pop();
        System.out.println(stack.pop().value);
    }
}


以上程序的执行结果是:

Java

Hello


总结

本文我们使用了数组和链表等物理结构来实现了栈,当然我们也可以使用其他容器来实现,比如 Java 中的 List,我们只需要保证在操作栈时是后进先出的执行顺序,并且至少包含 3 个重要方法:入栈、出栈和查询栈顶元素就可以了。


最后

算法和数据结构的学习是 3 分学 7 分练,只看不练是没办法学好算法的,而且学习算法和数据结构是一个循序渐进的过程,短时间内不会有明显的收效。因为这些算法经过了几百年的发展和积累才得以流传下来的,所以想要“玩得转”还需要一点耐心。


这里给你讲一个学习算法的“秘诀”:看不懂的知识要反复看,如果反复看还是看不懂,那么别着急,休息一下再继续看!相信我,对于学习算法这件事,所有人的过程都是一样的。

相关文章
|
5月前
|
数据采集 存储 JSON
推荐3款自动爬虫神器,再也不用手撸代码了
推荐3款自动爬虫神器,再也不用手撸代码了
250 4
|
8月前
|
Android开发 容器
Android开发第二次课 布局方式
Android开发第二次课 布局方式
50 0
|
IDE 编译器 开发工具
|
Java
Java实现拼图小游戏(6)—— 移动图片(键盘监听实操练习)
当我们实现向上移动图片的时候,其实就是把空图片的下面一张图片往上移动,然后将空图片的下面那张图片设置为空图片,最后再调整初始位置为现在空图片所在位置即可,注意做完这些以后还要再加载图片,否则显示不出来
400 0
Java实现拼图小游戏(6)—— 移动图片(键盘监听实操练习)
|
前端开发 JavaScript 索引
2022年了!再来手撕一下前端瀑布流代码吧!
**前言: **知识是学不完的,可是我们为什么还是要不停的去学习呢。原因很简单,因为我们要产生更多的知识,让更多的人学不完!前端技术也是在不停的革新,我们要做那个让别人有学不完的知识的人
1043 0
2022年了!再来手撕一下前端瀑布流代码吧!
|
存储 移动开发 小程序
如何实现微信小程序图像剪切?代码拿去用,不谢!
我在早先发布的文章《如何实现微信小程序换头像?三步帮你搞定!》中,提到实现微信小程序换头像需要三步: 获取用户头像 图片模板 图片合成 前文已经就获取用户头像和图片模板两个步骤进行了讲解,本文就来详细说说如何合成图片。图片合成的过程中非常重要的一块功能对图片进行剪切。该功能点很固定,大都是对图片进行拖拽、缩放后,在一定区域内剪切出一个固定长宽的图片。这类功能在app端和H5中都有很多成熟的插件供使用,接下来就来看看我在海豚趣图小程序中的头像剪切插件是如何实现的,欢迎大家提意见。
|
编解码 图形学 Android开发
解锁爬坑新技能:FairyGUI在Unity中遇见的问题-补充
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
640 0