上图是最最基本的结构,这次我采用数组实现栈。使用数组实现栈,由于java的数组是固定长度的。所以我需要写一个增加长度的方法。然后就是迭代的问题了。使用数组实现栈的话,我们需要写一个迭代器。不过这个迭代器非常容易实现,只需要让其implements Iterator再实现Iterator接口的方法就行。下边来看看源代码吧
import java.util.Iterator;
import java.util.Objects;public class TestStack {public static class stack<Item>{/*** 创建迭代器*/private class ReverseArrayIterator implements Iterator<Item>{private int i=N;@Overridepublic boolean hasNext() {return i>0;}@Overridepublic Item next() {return a[--i];}@Overridepublic void remove() {}}private Item a[];private int N;public stack(int cap){//定义一个容量a=(Item[]) new Object[cap];}public Iterator<Item> iterator(){ //返回一个迭代器return new ReverseArrayIterator();}public boolean isEmpty(){//判断栈是否为空return N==0;}public int size(){//返回栈的元素数量return N;}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;//避免对象游离if(N>0 && N==a.length/4) resize(a.length/2);return item;}private void resize(int max){//增加数组长度Item[] temp=(Item[]) new Objects[max];for(int i=0;i<N;i++){temp[i]=a[i];}a=temp;}}public static void main(String[] args) {stack<Integer> integerstack = new stack<Integer>(100);integerstack.push(123);integerstack.push(1);integerstack.push(13);integerstack.push(23);Iterator<Integer> iterator = integerstack.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}}
}
再来讲讲游离的问题吧
java中的垃圾回收策略是回收所有无法被访问的对象的内存。而上边pop()方法中被弹出的元素的引用其实还是存在在数组中。但是这个元素其实已经永远无法被访问了,但是java的垃圾收集器比较“机智”没办法知道这一点,除非该引用被覆盖不然他没办法被访问。所以这种保存一个不需要的对象的引用就是游离。在此避免游离的方法很简单就是给他赋值为null即可,这将覆盖无用的引用并使系统使用例被弹出的元素后回收它的内存。