隊(duì)列

隊(duì)列是一個(gè)有序列表,可以使用數(shù)組或鏈表來(lái)實(shí)現(xiàn)
遵循先入先出的原則。即:先存入隊(duì)列的數(shù)據(jù),要先取出。后存入的要后取出

使用數(shù)組實(shí)現(xiàn):

package com.swh.data;

public class Queue {
    private int[] queueTopic;
    private int occupiedSize = 0;


    private Queue(int[] queueTopic) {
        this.queueTopic = queueTopic;
    }

    public static Queue createQueue(int size){
        int[] initQueue = new int[size];
        return new Queue(initQueue);
    }


    public void pushQueue(int num){
        if(occupiedSize>=queueTopic.length)throw new RuntimeException("隊(duì)列已滿");
        queueTopic[occupiedSize]=num;
        occupiedSize++;
    }



    public int pullQueue(){
        if(occupiedSize<=0)throw new RuntimeException("隊(duì)列已空");
        int stratData = queueTopic[0];

        for(int i =0;i<occupiedSize;i++){
            if(i>=queueTopic.length-1)
                queueTopic[queueTopic.length-1]=0;
            else
                queueTopic[i] = queueTopic[i + 1];
        }
        occupiedSize--;
        return stratData;
    }

    public int queueSize(){
        return occupiedSize;
    }
}

上述思路是使用當(dāng)隊(duì)列第一個(gè)元素出隊(duì)列時(shí),剩下的隊(duì)列中的元素,統(tǒng)一進(jìn)行左移,然后保證新進(jìn)的數(shù)據(jù)可以正常進(jìn)入,同時(shí)出隊(duì)列的位置也可以重新被利用,但是這樣會(huì)造成大量的性能消耗。

使用數(shù)據(jù)實(shí)現(xiàn)隊(duì)列(升級(jí)版)

class Queue1 {
    private int queueSize;
    private int headPointer;
    private int tailPointer;
    private int[] arr;

    public Queue1(int queueSize) {
        this.queueSize = queueSize;
        headPointer = -1;
        tailPointer = -1;
        arr = new int[queueSize];
    }

    public boolean isfull() {
        return headPointer - tailPointer >= queueSize;
    }

    public boolean isEmpty() {
        return headPointer == tailPointer;
    }


    public void addQueue(int num) {
        if (isfull()) System.out.println("隊(duì)列滿了,不能再插入數(shù)據(jù)");
        headPointer++;
        headPointer = headPointer % 3;

        arr[headPointer] = num;
    }

    public int getQueue() {
        if (isEmpty()) throw new RuntimeException("隊(duì)列空了,不能再取數(shù)據(jù)");
        tailPointer++;
        tailPointer = tailPointer % 3;
        int tail = arr[tailPointer];
        arr[tailPointer] = 0;
        return tail;
    }

    public int getHeadQueue() {
        if (isEmpty()) throw new RuntimeException("隊(duì)列空了,沒(méi)有頭數(shù)據(jù)");
        return arr[headPointer];
    }

    public int[] showQueues() {
        if (isEmpty()) throw new RuntimeException("隊(duì)列空了,沒(méi)有隊(duì)列數(shù)據(jù)");

        for(int i=tailPointer+1;i<=tailPointer+getSize();i++){
            System.out.printf("隊(duì)列中的數(shù)據(jù):arr[%d]=%d\n",i%queueSize,arr[i%queueSize]);
        }

        return arr;
    }

    public int getSize() {
        return (queueSize+headPointer-tailPointer)%queueSize;
        //  下面所注釋的代碼可以合并成上面一句代碼
        

       /* if(headPointer>=tailPointer){
            return headPointer-tailPointer;
        }else {
            //這個(gè)是指tailPointer指針大于headPointer指針時(shí)
            // 獲取隊(duì)列長(zhǎng)度應(yīng)該是  (queueSize-tailPointer-1)+(headPointer+1)
            return queueSize+headPointer-tailPointer;
        }*/
    }
}

這種思路是巧妙的使用一個(gè)環(huán)形隊(duì)列來(lái)解決問(wèn)題,不需要數(shù)組元素的遷移動(dòng)作,從而大大增加了效率。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容