卜若的代碼筆記-數據結構系列-第十六章:隊列一.數組實現

1.實現思路如圖16-1所示

圖16-1:

當然,這種實現辦法有好處也有壞處。

壞處是,數組原先的資源沒有被釋放,留着佔內存。

另外,如果使用固定長度的數組,那麼很容易就會滿數組,從而爆出指針超過邊界的文圖

優化方式見圖16-2

好處是,入隊和出隊的時間複雜度是o(1) 

 

圖16-2:

對於圖2的方法,可以節省了空間的開銷,但是,對於出隊的操作時間複雜度則是o(n)。

這種寫法其實不是很好

以下是圖16-1的實現代碼:

public interface IQueue<T> {

    void enQueue(Element<T> element);
    Element<T> deQueue();
    int len();

}
public class TQueue<T> implements IQueue<T> {


    DynamicArray<Element<T>> list;
    public int head;
    public int end;
    private int len;
    public TQueue(){
        //見該系列第14章
        list = new DynamicArray<>(20);
    }
    @Override
    public void enQueue(Element<T> element) {
        list.change(end,element);
        end++;
        len++;
    }

    @Override
    public Element<T> deQueue() {

        if (len<=0){

            Debug.Log("隊列爲空");

             return null;
        }
        Element el = list.get(head);
        head++;

        len--;
        return el;
    }

    @Override
    public int len() {

        return len;
    }
}

以下是圖16-2的實現代碼

 就是多了個前移的操作

public class TQueue2<T> extends TQueue<T> {


    @Override
    public Element<T> deQueue() {

        Element head = getList().get(0);

        for (int i = 1;i<len();i++){
            getList().change(i-1,getList().get(i));
        }
        setLen(len()-1);
        return head;
    }
}

測試代碼:

 public static void main(String[] args) throws IOException {

        TQueue2<Integer> tQueue = new TQueue2<>();

        for (int i =0;i<100;i++){
            tQueue.enQueue(new TElement<>(i));

        }

        while (tQueue.len()!= 0){

            System.out.println(tQueue.deQueue().getValue()+"<長度:>"+tQueue.len());
        }
        System.out.println("\n");

    }

結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章