用java以数组为底层数据结构创建自己的栈

java以数组为底层数据结构创建自己的栈

栈可以解决什么问题呢:

1.括号匹配问题

2.递归

3.表达式求值问题

首先明确栈的功能:

1.入栈:给底层数组的尾部插入元素相当于入栈

2.出栈:把底层数组的最后一个元素提出来相当于出栈

3.获取栈长度:获取size

4.判断栈是否为空:底层数组size==0则为空

5.获取栈顶:返回底层数组的最后一个元素

由于底层结构是数组,我们也可以用别的结构来创建这个栈,但是栈的方法总归是这么些个,所以我们需要把这些方法写在接口里,然后用数组栈来实现这个接口的功能

接口:

java 复制代码
public interface selfstack <T> {
    //入栈
    void push(T e);

    //出栈
    T pop();

    //查看栈顶元素
    T peak();

    //判断是否为空
    boolean IsEmpty();

    //获取栈中元素的个数
    int geiSize();
}

ArrStack:

java 复制代码
public class ArrStack<T> implements selfstack<T> {

    //底层用上一篇我们自己写的数组
    private MyArrary<T> data;   //容器
    private int size;

    //默认构造方法为创建一个100大小的自己数组
    public ArrStack(){
        this.data=new MyArrary<T>(100);
        this.size=0;
    }

    public void push(T e) {
        //调用自己数组的向尾部添加元素,这样子效率较高,如果向头部添加元素还需要往后推移
        this.data.adddata(e);
        this.size++;
    }

    //出栈
    public T pop() {
        T e=this.data.getindexdata(size-1); //先保存这个元素
        this.data.delete(this.size-1);  //然后删除
        this.size--;    //长度减一
        return e;
    }

    //返回栈顶元素
    public T peak() {
        return this.data.getindexdata(this.size-1);
    }

    //判断栈是否为空
    public boolean IsEmpty() {
        return this.size==0;
    }

    //获取栈实际长度
    public int geiSize() {
        return this.size;
    }
}

测试:

java 复制代码
public class stacktest<T> {
    public void test(selfstack stack, List<T> list){
        //开始时间
        long startTime=System.nanoTime();
        //入栈
        for (int i = 0; i < list.size(); i++) {
            stack.push(list.get(i));
        }
        System.out.println("栈中元素个数:"+stack.geiSize());
        //出栈
        while(!stack.IsEmpty()){
            T e= (T) stack.pop();
            System.out.print("--->"+e);
        }
        //结束时间
        long endTime=System.nanoTime();
        System.out.println("总耗时:"+(endTime-startTime)/1000000000.0+"s");
    }

    public static void main(String[] args) {
        stacktest<Integer> st=new stacktest<Integer>();
        selfstack<Integer> stack=new ArrStack<Integer>();   //继承了selftack的ArrStack来实现selfstack
        List<Integer> list=new ArrayList<Integer>();
        Random r=new Random();
        for (int i = 0; i < 100; i++) {
            list.add(r.nextInt(100));
        }
        list.add(100);
        st.test(stack,list);
    }
}
相关推荐
eternal__day几秒前
Spring Cloud 多机部署与负载均衡实战详解
java·spring boot·后端·spring cloud·负载均衡
颜淡慕潇4 分钟前
Redis 实现分布式锁:深入剖析与最佳实践(含Java实现)
java·redis·分布式
程序员秘密基地10 分钟前
基于vscode,idea,java,html,css,vue,echart,maven,springboot,mysql数据库,在线考试系统
java·vue.js·spring boot·spring·web app
何中应12 分钟前
【设计模式-5】设计模式的总结
java·后端·设计模式
草莓熊Lotso12 分钟前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
海的诗篇_29 分钟前
前端开发面试题总结-JavaScript篇(二)
开发语言·前端·javascript·typescript
吾日三省吾码29 分钟前
Spring 团队详解:AOT 缓存实践、JSpecify 空指针安全与支持策略升级
java·spring·缓存
风象南1 小时前
SpringBoot的5种日志输出规范策略
java·spring boot·后端
cccc来财1 小时前
Go中的协程并发和并发panic处理
开发语言·后端·golang
咖啡啡不加糖1 小时前
深入理解MySQL死锁:从原理、案例到解决方案
java·数据库·mysql