需求:动态调节整数组a[ ]的大小。使得它既能保存所有的元素,又不至于浪费过多的空间。
解决方案: 首先,将栈移动到另一个大小不同的数组中。
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;
}
}
接下,在push()中检查数组大小是否太小。通过检查栈大小N 和a.length 是否相等判断是否可以容纳新的元素。如果没有多余的空间,我们会将数组的长度加倍,然后一样用a[N++]=item
插入新的元素。
public void push(Item item) {
if(N==a.length) {
resize(2*a.length);
}
a[N++] = item;
}
}
在pop()中,首先删除栈顶的元素,然后若数太大就将数组的长度减半。检查的条件就是栈大小是否小于数组的四分之一。在数组减半以后,它的状态仍然是半满状态。
public Item pop() {
Item item = a[N--];
a[N] = null;
if(N>0 && N==a.length/4) {
resize(a.length/2);
}
return item
}
在这样的实现中,栈永远不会溢出,使用率不会低于1/4。