算法_隊列的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;
        }
        
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM