算法_队列的Java通用数组实现

  在实现Queue的API的时候,可以使用两个实例变量做索引,一个变量head指向队列的开头,另一个变量tail指向队列的结尾.在删除一个元素的时候,使用head访问,并将head+1,插入一个元素的时候,使用tail保存它,并将tail加1.如果某个索引增加到超过了数组的边界的时候,则将它重置为0.下面是队列的数组实现,除了对于头元素和尾元素的基本操作以外,其余基本和堆栈相同.

  

import java.util.Iterator;

//编写一个类ResizingArrayQueueOfStrings使用定长数组实现队列的抽象,
//然后扩展实现,使用调整数组的方法突破数组大小的限制
public class ResizingArrayQueueOfStrings<Item> implements Iterable<Item> {
    private Item[] a=(Item[])new Object[1];
    int head=0;        //指向队列的开头的索引
    int tail=0;        //指向队列的结尾的索引
    int N;            //数组中装填的元素数量
    
    public boolean isEmpty() {
        return N==0;
    }
    public int size() {
        return N;
    }
    public void add(Item item) {
        if(N==a.length) resize(a.length*2);//N增加至数组容量的时候,动态扩展数组的大小
        a[tail++]=item;        //从tail(尾部)索引处获取元素.
        if(tail==a.length) tail=0;    //如果tail索引增加到了数组的长度,那么重新置0
        N++;                //增加N.
    }
    public Item remove() {
        Item item=a[head];    //从队列头移除元素
        a[head++]=null;        //将队列头的元素设为null,避免对象游离
        N--;                //将N减一
        if(head==a.length) head=0;    //如果head索引增加到了数组的长度,重新置0
        if(N<a.length/4) resize(a.length/2);    
        return item;    //返回队列头部的元素.
    }
    public void resize(int n) /*动态调整数组大小的方法*/{
        //将数组引用指向一个更大的数组
        Item[] items=(Item[])new Object[n];
        for(int i=0;i<N;i++) {
            items[i]=a[(i+head)%a.length];    //从头元素开始赋值给新的元素.
        }
        a=items;
        //将头元素和尾部元素分别置位.
        head=0;    
        tail=N;
    }
    @Override
    public Iterator<Item> iterator() {
        return new QueueIterator();
    }
    class QueueIterator implements Iterator<Item> {
        int i=0;
        @Override
        public boolean hasNext() {
            return i<N;    
        }

        @Override
        public Item next() {
            Item item=a[(i+head)%a.length];    //从头元素开始获取元素.
            i++;
            return item;
        }
        
    }
}

 

posted @ 2016-06-29 10:27  hlhdidi  阅读(3524)  评论(0编辑  收藏  举报