数组实现栈
package base.第一章.背包_队列_和栈.数组实现定容栈;
import java.lang.Iterable;
import java.util.Iterator;
/**
* Created by MK on 2018/7/31.
* 现在我们就通过上面所学的迭代,来重新定义下压栈
* {
* 这份泛型的可迭代的Stack API的实现是所有集合类(实现了 implements Iterable<Item>)抽象数据(Item)类型实现的模板,它将
* 所有的元素保存到数组中,并动态的调整数组的大小以保持数组大小和栈大小之比小于一个常数。
* }
*/
public class 数组实现Stack_栈<Item> implements Iterable<Item> {
//创建容量数组;默认长度为1,该长度会动态调整。(即栈元素)
private Item[] a = (Item[]) new Object[1];
private int N = 0; //元素数量
public Boolean isEmpty() {
return N == 0;
}
public int size() {
return N;
}
//复制数组
public Item[] resize(int max) {
Item[] item = (Item[]) new Object[max];
for (int i = 0; i < N; i++) item[i] = a[i];
return a = item; //将老数组变为新数组
}
//往栈中压入元素
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; //此时的N是--N后的N,为null避免游离
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> {
private int i = N;
public boolean hasNext() {
return i > 0;
}
public Item next() {
return a[--i];
} //支持后进先出的迭代
public void remove() {
}
}
}