用数组实现一个下压栈 (能够动态调整数组大小)

用数组实现一个下压栈 (能够动态调整数组大小)

在计算机的世界中,栈这种数据结构及其重要。后进先出是栈的主要用途。
日常生活中,栈的思想随处可见:

  • 电梯中的人,总是后进先出
  • 交给别人的文件,后面交的人的文件总是会被先处理。

下面是用数组的方式实现一个栈的代码。

import java.util.Iterator;

/**
 * @author zhangjinglong
 * @date 2019-06-05-20:41
 * 用数组实现一个下压栈 (能够动态调整数组大小)
 */

public class ResizingArrayStack<Item> implements Iterable<Item> {

    private Item[] a=(Item[]) new Object[1];//栈元素  注意这里不能直接写成 Item[] a =new Item[1];编译会报错
    private int N=0;  //元素数量

    public boolean isEmpty(){//栈是否为空
        return N==0;
    }

    public int size(){ //返回栈的大小
        return N;
    }

    private void resize(int max){
        //将栈移动到一个大小为max的新数组
        Item[]  temp=(Item[]) new Object[max];//定义临时数组
        for (int i = 0; i < N; i++) {
            temp[i]=a[i];//引用复制
        }

        a=temp;//改变a的原始指向,以达到动态改变数组大小的目的。

    }

    public void push(Item item){
        //将元素添加到栈顶
        if(N==a.length) resize(a.length*2);//如果栈元素个数等于数组长度,给数组扩容。
        a[N++]=item;//
    }

    public Item pop(){
        //从栈顶删除元素
        Item item=a[--N];//N表示元素个数,--N后是数组的真实下标
        a[N]=null;//这一步很重要,将删除的对象引用置为null,方便JVM回收删除的对象,避免对象游离。
        if(N>0 && N==a.length/4){
            resize(a.length/2);
        }
        return item;//返回删除的元素

    }


    public Iterator<Item> iterator(){
        return new ReverseArrayIterator();
    }

    private class ReverseArrayIterator implements Iterator<Item>{
        //支持后进先出的迭代
        //定义迭代器的目的:方便使用java的forEach语法迭代访问栈中元素
        private int i=N;
        public boolean hasNext(){return i>0;}
        public Item next(){return a[--i];}
        public void remove(){}//这个接口方法一般不实现它
    }


    public static void main(String[] args) {
        ResizingArrayStack<String> test=new ResizingArrayStack<>();
        test.push("I");
        test.push("Love");
        test.push("You");
        System.out.println(test.pop());
        System.out.println("栈是否为空:"+test.isEmpty());
        for(String s:test){
            System.out.println("元素:"+s);
        }
    }


}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
疫情居家办公系统管理系统按照操作主体分为管理员和用户。管理员的功能包括办公设备管理、部门信息管理、字典管理、公告信息管理、请假信息管理、签到信息管理、留言管理、外出报备管理、薪资管理、用户管理、公司资料管理、管理员管理。用户的功能等。该系统采用了MySQL数据库,Java语言,Spring Boot框架等技术进行编程实现。 疫情居家办公系统管理系统可以提高疫情居家办公系统信息管理问题的解决效率,优化疫情居家办公系统信息处理流程,保证疫情居家办公系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理疫情居家办公系统信息,包括外出报备管理,培训管理,签到管理,薪资管理等,可以管理公告。 外出报备管理界面,管理员在外出报备管理界面中可以对界面中显示,可以对外出报备信息的外出报备状态进行查看,可以添加新的外出报备信息等。签到管理界面,管理员在签到管理界面中查看签到种类信息,签到描述信息,新增签到信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值