在书中看见基于泛型的动态数组的实现代码,基本思想是通过定义变量N来控制数组的大小,当进行push的时候将N的大小与数组a的大小(a.length)同时改变。
import org.hibernate.loader.custom.Return;
import java.util.Iterator;
/**
* 《算法》第四版 调整数组大小
*
* @author 灿夏Summer
* @@date 2018-07-12
*/
public class ResizingArrayStack<Item> implements Iterable<Item> {
private Item[] a = (Item[]) new Object[1];
private int N = 0;
public boolean isEmpty() {
return N == 0;
}
public int size() {
return 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;
}
}
public void push(Item item) {
//判断当数组元素计数变量N与数组的长度相等的时候 那么将数组的长度扩充2倍
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;
}
@Override
public Iterator<Item> iterator() {
return new ReverseArrayIterator();
}
private class ReverseArrayIterator implements Iterator<Item> {
private int i = N;
@Override
public boolean hasNext() {
return i > 0;
}
@Override
public Item next() {
return a[--i];
}
@Override
public void remove() {
}
}
}
贴上测试代码
1 测试push
import java.awt.event.ItemEvent;
import java.util.Iterator;
/**
* 动态调整数组大小测试类
*
* @author 灿夏Summer
* @date 2018-07-12
*/
public class ArrayTest {
public static void main(String[] args) {
ResizingArrayStack<Integer> item = new ResizingArrayStack<Integer>();
Integer a ;
int max = 10;
//测试添加
for (int i=0;i<max;i++){
a = i;
item.push(a);
System.out.println(item.size());
}
}
}
控制台输出
1
2
3
4
5
6
7
8
9
10