栈的深究

	一般在实现栈时,如果用数组存时,老想着在压栈时,扩展数组,在栈是总忽略压缩数组,还想着看看数组内部的结构,遍历栈时老想着用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 

猜你喜欢

转载自blog.csdn.net/qq_37964379/article/details/78933577