专栏首页java技术大本营数据结构|用java自己手写实现一个栈

数据结构|用java自己手写实现一个栈

javaDEMO

本网站记录了最全的各种JavaDEMO ,保证下载,复制就是可用的,包括基础的, 集合的, spring的, Mybatis的等等各种,助力你从菜鸟到大牛,记得收藏哦~~ https://www.javastudy.cloud

用java实现一个栈

栈主要有以下特性和操作: 1.先进后出 2.有入栈和出栈的操作 因为我们demo中也只先完成这两个简单的特性和操作 代码如下:

/**
 * @Author https://www.javastudy.cloud
 * @CreateTime 2019/11/6
 **/
public class StackDemo<E> {
    /** 底层使用一个泛型数组做存储 */
    private E[] items;
    private int top;
    private int capacity;

    public StackDemo() {
        //会调用下面一个构造方法,初始化一个长度为10的数组
        this(10);
    }

    public StackDemo(int i){
        this.capacity=i;
        this.items=(E[])new Object [this.capacity];
        this.top=0;
    }

    /**
     * 入栈操作
     */
    public void push(E e) throws Exception{
        if(top!=capacity){
            items[top++]=e;
            //判断数据是不是已经满了,看需不需要扩容
            resize();
        }else{
            throw new Exception();

        }
    }

    /**
     * 出栈操作
     */
    public E pop() throws Exception{
        if(top==0){
            throw new Exception();

        }else{
            E ret=items[--top];
            items[top]=null;
            return ret;
        }
    }

    /**
     * resize操作,把数组扩大两倍
     */
    public void resize(){
        // 如果top和capacity相等的话,说明满了
        if(top==capacity){
            // 把范围扩大2倍
            this.capacity = this.capacity*2;
            // new一个新数组
            E[] newItems = (E[])new Object [this.capacity];
            // 转移老数据
            System.arraycopy(items,0,newItems,0,items.length);
            // 把新的数组当成底层的存储
            this.items = newItems;
        }
    }

    public static void main(String[] args) {
        StackDemo<String> stack = new StackDemo<>(2);
        try {
            stack.push("first");
            stack.push("second");
            stack.push("third");
            stack.push("four");
            String pop = stack.pop();
            System.out.println(pop);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

DEMO总评

栈是基础也是极其重要的数据结构,不仅仅要明白栈的特性,同时也要具备能手写一个栈的能力,在写的过程中才能注意到那些可能有坑的地方,才能注意到那些小细节,如System.arraycopy的使用,以及在多线程情况下的风险, 加油吧,少年!

本文分享自微信公众号 - java技术大本营(java-ideashare),作者:微笑的小小刀

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计模式|05 抽象工厂模式

    博主的博客地址: https://www.jeffcc.top/ 博主学习设计模式用的书是Head First的《设计模式》,强烈推荐配套使用!

    微笑的小小刀
  • 设计模式|01 策略模式

    博主博客地址:https://www.jeffcc.top/ 设计模式系列是我通过看Head First 的《设计模式》中学到的知识总结,这是本不错的设计模式入...

    微笑的小小刀
  • java练习本(2019-08-10)

    “ Love is the true means by which the world is enjoyed: our love to others, and ...

    微笑的小小刀
  • 你知道 android 的 MessageQueue.IdleHandler 吗?

    干货!干货!或许可以是一种处理问题的新思路哟!

    serena
  • flutter启动流程跟踪简析

    我们项目接入flutter由来已久,采用的是混栈开发的方式,没有办法,因为项目开发了比较久,全部替换为flutter实现想想也不太现实,混栈开发的过程中,我们遇...

    brzhang
  • 【小家Spring】Spring任务调度@Scheduled的使用以及原理、源码分析(@EnableScheduling)

    JDK给我们提供了定时任务的能力,详解之前有篇博文: 【小家java】Java定时任务ScheduledThreadPoolExecutor详解以及与Time...

    YourBatman
  • 你知道android的MessageQueue.IdleHandler吗?

    前言 我们知道android是基于Looper消息循环的系统,我们通过Handler向Looper包含的MessageQueue投递Message, 不过我们...

    腾讯Bugly
  • Cobalt Strike折腾踩坑填坑记录

    最近在做渗透测试相关的工作,因工作需要准备用Cobalt Strike,老早都知道这款神器,早几年也看过官方的视频教程,但英文水平太渣当时很多都没听懂,出于各种...

    FB客服
  • 6.Sentinel源码分析—Sentinel是如何动态加载配置限流的?

    有时候我们做限流的时候并不想直接写死在代码里面,然后每次要改规则,或者增加规则的时候只能去重启应用来解决。而是希望能够动态的更改配置,这样万一出现紧急情况还能动...

    luozhiyun
  • EurekaClient自动装配及启动流程解析

    老规矩,先看spring.factories文件,其中引入了一个配置类EurekaDiscoveryClientConfigServiceBootstrapCo...

    Java学习录

扫码关注云+社区

领取腾讯云代金券