4、算法-定容栈数组调节长度

代码

package base.第一章.背包_队列_和栈.数组实现定容栈.定容栈;

/**
 * Created by MK on 2018/7/25.
 * 定容栈调节数组长度
 * 选择用数组表示栈,意味者用例必须要预估栈的大小,同时还需要时刻检测栈是否满,防止push的时候溢出,这样很不好。
 * <p>
 * 为此我们需要修改数组的实现,动态调整数组a[]的大小,使得它即足以保存所有元素,又不至于浪费过多的空间
 * 1、因此我们需要实现一个方法将栈移动到另一个大小不同的数组中。
 * private void resize(int max)
 * {
 * Item[] temp = (Item[])new Object[max];//将大小为N<= max的栈移动到一个新的大小为max的数组中
 * for(int i=0;i<N;i++) temp[i]=a[i];//将老数组中的数据赋值给新数组中的数据
 * a=temp;//将老数组赋值给新数组
 * }
 * 2、现在,在push()中,检查数组是否太小。通常是使用栈的大小N与数组的大小a.length是否相等来检查数组是否能够容纳新的元素,
 * 如果没有多余的空间,就将数组的长度加倍,然后就可以使用以前的办法:a[N++]=item来插入新的元素了
 * public void push(Item item){
 * //将元素压入栈中
 * if(N==a.length) resize(2 * a.length)
 * a[N++] = item;
 * }
 * 3、类似在pop()中,首先删除栈顶的元素.
 * public Item pop(){
 * //从站定删除元素
 * Item item = a[--N];
 * a[N] = null; //避免对象游离,下节会讲
 * <p>
 * 下面这么写的意义:
 * 前提我对数组长度定义100
 * 首先假如原数据中的N是有100个的话,我中间如果没有pop的话,那么此时我resize后数组长度是200
 * 但是我如果中间有pop的话,那么此时我触发了--N,对应的我N的数量就会发生变化(减少),但我数组是不会变得
 * 此时,就有可能会出现N的长度等于 数组长度得1/4,那么相差就很大了,我们可以动态得对其进行调整,让他们始终是
 * 相差2倍得关系。
 * if ( N>0 && N==a.length / 4 ) resize(a.length/2)
 * <p>
 * }
 * 4、综上所述,栈永远不会一处,使用率也永远不会低于四分之一。
 * 那么什么情况下会低于1/4呢?栈为空也就是N为0,那么数组得大小就是1了即int[] a = new int[1],这里不能为0否则报错
 * 因为长度没有为0一说。
 */
public class 定容栈调节数组长度<Item> {
    private Item[] a;
    private int N;

    private void resize(int max) {
        Item[] temp = (Item[]) new Object[max];
        for (int i = 0; i < N; i++) temp[i] = a[i];
        a = temp;
    }


    //创建泛型数组在Java中是不可以实现的,因此我们要使用,类型转换
    定容栈调节数组长度(int cap) {
        a = (Item[]) new Object[cap];
    }

    public int Size() {
        return N;
    }
    public int ArraySize(){
        return a.length;
    }


    public void push(Item item) {
        if (N == a.length) resize(2 * a.length);

        a[N++] = item;
    }

    public Item pop() {
        Item item = a[--N];
        a[N] = null;
        if (N > 0 && N == a.length / 4) resize(a.length / 2);
        return item;
    }


}

定容栈数组调节长度测试

package base.第一章.背包_队列_和栈.数组实现定容栈.定容栈;

import edu.princeton.cs.algs4.StdOut;

/**
 * Created by MK on 2018/7/25.
 */
public class 定容栈调节数组长度测试 {
    public static void main(String[] args) {
        定容栈调节数组长度<Integer> end = new 定容栈调节数组长度<Integer>(2);
        end.push(1);
        end.push(2);
        end.push(2);
        end.push(2);
        end.push(2);

        StdOut.println(end.Size() +"数组长度"+end.ArraySize());
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值