一般在实现栈时,如果用数组存时,老想着在压栈时,扩展数组,在栈是总忽略压缩数组,还想着看看数组内部的结构,遍历栈时老想着用pop(),
尴尬的是当用pop()时,栈内的所有元素都已出栈。
对于数组的容量的处理办法是,当N(站内元素)==a.lengh(数组容量),扩展数组容量为2*a.length,当N==a.length/4时,将数组容量压缩为
a.length/2,此时它的状态约为半满,在下次改变数组之前仍能进行多次push()和pop()操作。对于遍历可以使用迭代,通过实现Iterable接口实现。
代码实现如下:
package NewStack;
import java.util.Iterator;
public class ResizingArrayStack<T> implements Iterable<T>{
private T[] a=(T[])new Object[1];//栈元素
private int N=0; //元素数量
public boolean isEmpty() {return N==0;}
public int size() {return N;}
private void resize(int max) {
//将栈移动到一个大小为max的数组中
T[] temp=(T[])new Object[max];
for(int i=0;i<N;i++) {
temp[i]=a[i];
}
a=temp;
}
public void push(T t) {
if(N==a.length) resize(a.length*2);
a[N++]=t;
}
public T pop() {
T temp=a[--N];
a[N]=null;//避免对象游离
if(N==a.length/4) resize(a.length/2);
return temp;
}
public T peek() {
return a[N];
}
@Override
public Iterator<T> iterator() {
return new ReverseArrayIterator();
}
private class ReverseArrayIterator implements Iterator<T>{
int i=N;
@Override
public boolean hasNext() {
return i>0;
}
@Override
public T next() {
return a[--i] ;
}
}
}
用列代码:
package NewStack;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
ResizingArrayStack<String> a=new ResizingArrayStack<>();
a.push("a");
a.push("b");
a.push("c");
a.push("d");
a.push("e");
Iterator<String> i=a.iterator();
for(;i.hasNext();) {
System.out.print(i.next()+" ");
}
}
}
输出结果:
e d c b a