代码
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());
}
}