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

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

自定义栈I:数组实现

通过上面的内容,我们知道了栈属于逻辑结构,因此它的实现方式就可以有很多种了,比如数组的实现方式或者是链表的实现方式。那么我们就先用数组实现一下,栈的主要方法有:image.png

① 定义结构

那么我们先来定义它的结构:

public class MyStack<E> {
    private Object[] value = null; // 栈存储容器
    private int top = -1; // 栈顶(的指针)
    private int maxSize = 0; // 栈容量
    // 构造函数(初始化默认容量)
    MyStack() {
        this.maxSize = 10;value=new Object[9];
    }
    // 有参构造函数
    MyStack(int initSize) throws Exception {
        if (initSize <= 0) {
            throw new Exception("栈容量必须大于 0");
        } else {
            value = new Object[initSize];
            maxSize = initSize;
            top = -1;
        }
    }
}


其中栈中数据会存储在 Object[] value 数组中,top 变量代表栈顶的指针,它其实存储的是栈顶元素的下标,会随着入栈不断变化(后进先出),maxSize 表示栈的最大容量。

② 入栈

此方法是给栈添加数据的,实现代码如下:

// 入栈(数据添加)
public boolean push(E e) throws Exception {
    if (maxSize - 1 == top) {
        throw new Exception("入栈失败,栈已满");
    } else {
        value[++top] = e;
        return true;
    }
}


每次当有数据插入时,只需在数组中添加一个值,并将栈顶的下标 +1 即可。

入栈操作如下图所示:

image.png

③ 出栈

此方法是删除栈中的数据的,实现代码如下:

// 数据移除(出栈)
public E pop() throws Exception {
    if (top <= -1) {
        throw new Exception("移除失败,栈中已无数据");
    } else {
        return (E) value[top--];
    }
}


出栈只需删除数组中栈顶数据(最后加入的数据),并修改栈顶下标 -1 即可。

出栈操作如下图所示:

image.png

④ 数据查询

除了以上操作方法之外,我们还需要添加一个查询栈顶数据的方法:

// 数据查询
public E peep() throws Exception {
    if (top <= -1) {
        throw new Exception("移除失败,栈中已无数据");
    } else {
        return (E) value[top];
    }
}


⑤ 代码测试

到此为止栈的数据结构就已经实现完了,接下来我们来测试一下:

// 代码测试
public static void main(String[] args) throws Exception {
    MyStack stack = new MyStack(10);
    stack.push("Hello");
    stack.push("Java");
    System.out.println(stack.peep());
    stack.pop();
    System.out.println(stack.pop());
}


以上程序的执行结果为:

Java

Hello

从上述代码可以看出,我们添加栈的顺序是 HelloJava 而输出的顺序是 JavaHello 符合栈的定义(后进先出)。


相关文章
|
图形学 Android开发 容器
解锁爬坑新技能:FairyGUI在Unity中遇见的问题
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
1138 0
|
7月前
|
监控
一篇文章讲明白iosavplayer视频播放器
一篇文章讲明白iosavplayer视频播放器
35 0
|
前端开发
前端——关于鼠标的知识点
前端——关于鼠标的知识点
|
Java
Java实现拼图小游戏(6)—— 移动图片(键盘监听实操练习)
当我们实现向上移动图片的时候,其实就是把空图片的下面一张图片往上移动,然后将空图片的下面那张图片设置为空图片,最后再调整初始位置为现在空图片所在位置即可,注意做完这些以后还要再加载图片,否则显示不出来
400 0
Java实现拼图小游戏(6)—— 移动图片(键盘监听实操练习)
|
Java API 图形学
Java实现拼图小游戏(5)—— 美化界面(含源码阅读)
先加载的图片在上方,后加载的图片在下方,所以我们要把创建背景图的代码放在我们之前创建十五个小图片的代码后面,否则会出现背景图片将我们要拼的图片覆盖的情况
495 0
Java实现拼图小游戏(5)—— 美化界面(含源码阅读)
|
存储 算法 C++
数据结构与算法——第四节 栈和队列(C 模拟实现+思路分析+运行截图)
对于栈和队列,我们在这里只是把 其底层的原理简单的说一下,等到C++说到STL的时候,我们还会详细地说。
202 0
Java实现扫雷小游戏【完整版】大团子限定(下)
文章目录 1 系统概述 2 需求分析 3 总体设计 3.1 系统总体功能设计 3.2 系统总体流程设计 4 系统实现 4.1 Properties类 4.2 Bottom类 4.3 ShowBottomCount类 4.4 PaintBottomArea类 4.5 Cover类 4.6 MinTime类 4.7 GamePanel类 5 结果展示 5.1 扫雷游戏界面的整体设计 5.2 扫雷游戏失败判定部分的设计 5.3 扫雷游戏胜利判定部分的设计 6 完整资源
Java实现扫雷小游戏【完整版】大团子限定(下)
|
存储 搜索推荐 Java
Java实现扫雷小游戏【完整版】大团子限定(上)
文章目录 1 系统概述 2 需求分析 3 总体设计 3.1 系统总体功能设计 3.2 系统总体流程设计 4 系统实现 4.1 Properties类 4.2 Bottom类 4.3 ShowBottomCount类 4.4 PaintBottomArea类 4.5 Cover类 4.6 MinTime类 4.7 GamePanel类 5 结果展示 5.1 扫雷游戏界面的整体设计 5.2 扫雷游戏失败判定部分的设计 5.3 扫雷游戏胜利判定部分的设计 6 完整资源
Java实现扫雷小游戏【完整版】大团子限定(上)
|
前端开发 JavaScript 索引
2022年了!再来手撕一下前端瀑布流代码吧!
**前言: **知识是学不完的,可是我们为什么还是要不停的去学习呢。原因很简单,因为我们要产生更多的知识,让更多的人学不完!前端技术也是在不停的革新,我们要做那个让别人有学不完的知识的人
1031 0
2022年了!再来手撕一下前端瀑布流代码吧!
|
JavaScript API
面试官:手撕代码!判断两个对象是否相等?
前言 在实际项目开发中,判断两个对象是否相等可能是比较常见的需求了,有些小伙伴会使用第三方库实现,有些小伙伴会自己手动实现。不管怎么实现,只能能满足项目需求,那就是好样的。但是可能有些小伙伴如果对 JS 还不够熟悉,他可能就会有疑问:判断相等不是用==比较就可以了吗?答案肯定是错误的,面试官要是听了你这个回答,估计会当场吐血! 今天就来学一学如何比较两个对象是否相等? 学习目标:实现判断两个对象是否相等,即所有键值对相等。
447 0
面试官:手撕代码!判断两个对象是否相等?

热门文章

最新文章