复习---使用基础语法实现栈及迭代

在这里插入图片描述
上图是最最基本的结构,这次我采用数组实现栈。使用数组实现栈,由于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;
           @Override
           public boolean hasNext() {
               return i>0;
           }

           @Override
           public Item next() {
               return a[--i];
           }

           @Override
           public 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即可,这将覆盖无用的引用并使系统使用例被弹出的元素后回收它的内存。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值