數(shù)據(jù)結(jié)構(gòu)-隊(duì)列(java)

數(shù)據(jù)結(jié)構(gòu)

一群數(shù)據(jù)集合和數(shù)據(jù)之間的關(guān)系。
是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素集合。

隊(duì)列

特點(diǎn):先入先出(First in First out ---FIFO)

火車站買票。隊(duì)頭隊(duì)尾。售票員從頭開始賣票。先到的人先買到票就可以離開。

普通隊(duì)列

普通隊(duì)列.png

普通隊(duì)列有限制:
1.售票員走,浪費(fèi)隊(duì)列前面的空間。
2.隊(duì)伍走,需要移動數(shù)組,速度慢。

環(huán)形隊(duì)列

環(huán)形隊(duì)列.png

能大大優(yōu)化普通隊(duì)列
有隊(duì)列頭,有隊(duì)列尾。只有一個元素,既是隊(duì)列頭,又是隊(duì)列尾。
用途:自動排號機(jī)

環(huán)形隊(duì)列代碼

package ss;
/**
 * 環(huán)形隊(duì)列Demo
 * 簡單環(huán)形隊(duì)列的構(gòu)建
 * 
 * MyQueue(int capacity) 構(gòu)造方法(隊(duì)列大?。? * clearQueue() 清空隊(duì)列
 * destoryQueue() 銷毀隊(duì)列對象
 * isEmpty() 隊(duì)列判空
 * isFull() 隊(duì)列判滿
 * getLength() 獲取隊(duì)列長度
 * EnQueue(T) 入隊(duì)
 * DeQueue() 出隊(duì),返回隊(duì)列的元素
 * traverseQueue() 遍歷隊(duì)列
 * doSomething(T t) 具體實(shí)現(xiàn)邏輯,讓用戶具體實(shí)現(xiàn)
 * 
 * @author Administrator
 * @date 2017年10月24日 下午4:58:29
 * @param <T> 隊(duì)列元素
 * 因?yàn)榇娣胚M(jìn)隊(duì)列的元素我們是未知的
 * 但是可以確定的是一個隊(duì)列里面的元素基本是固定的
 * 所以這里使用了泛型,讓用戶真正使用的時候才去確定
 */
public abstract class MyQueue<T extends Object> {
    //隊(duì)列對象
    //使用Object數(shù)組和泛型是為了讓隊(duì)列可以兼容各種類型的對象;
    private Object[] mQueue;
    //隊(duì)列當(dāng)前長度
    private int mLength;
    //隊(duì)列容量
    private int mCapacity;
    //隊(duì)頭,出隊(duì)時出隊(duì)的位置
    private int mHead;
    //對尾,入隊(duì)時入隊(duì)的位置
    private int mEnd;
    /**
     * 構(gòu)造方法
     * @param capacity 隊(duì)列的容量大小
     */
    public MyQueue(int capacity) {
        mCapacity =capacity;
        //初始化參數(shù)
        mQueue=new Object[mCapacity];
        clearQueue();
    }
    /**
     * 清空隊(duì)列內(nèi)的參數(shù)
     *@date 2017年10月24日 下午5:05:19
     */
    private void clearQueue() {
        mLength=0;
        mHead=0;
        mEnd=0;
    }
    /**
     * 銷毀隊(duì)列
     * 及時釋放資源
     *@date 2017年10月24日 下午5:08:11
     */
    public void destoryQueue(){
        clearQueue();
        mQueue=null;
        System.gc();
    }
    /**
     * 判斷當(dāng)前隊(duì)列是否為空
     * 空:true 非空:flase
     *@date 2017年10月24日 下午5:10:12
     */
    public boolean isEmpty(){
        return mLength==0;
    }
    /**
     * 判斷當(dāng)前隊(duì)列是否已滿
     *@date 2017年10月24日 下午5:11:58
     */
    public boolean isFull(){
        return mLength==mCapacity;
    }
    /**
     * 獲取當(dāng)前隊(duì)列長度
     *@date 2017年10月24日 下午5:20:27
     */
    public int getLength(){
        return mLength;
    }
    
    /**
     * 添加元素到隊(duì)列當(dāng)中(入隊(duì))
     * 從隊(duì)尾開始入隊(duì)
     * @param t 需要入隊(duì)的對象
     * @return 入隊(duì)是否成功
     *@date 2017年10月24日 下午5:24:12
     */
    public boolean EnQueue(T t){
        if(isFull()){
            return false;
        }
        mQueue[mEnd] =t;
        mEnd++;
        mLength++;
        /**
         * 因?yàn)槭黔h(huán)形隊(duì)列模型,所以當(dāng)隊(duì)頭出隊(duì)以后
         * 就會空出位置,隊(duì)尾自然就可以往空位置上移動
         * 所以這里使用%來出來循環(huán)
         */
        mEnd=mEnd%mCapacity;
        return true;
    }
    /**
     * 返回隊(duì)頭位置的元素對象(出隊(duì))
     *@date 2017年10月24日 下午5:27:52
     */
    public T DeQueue(){
        if(isEmpty()){
            return null;
        }
        T t =(T) mQueue[mHead];
        mHead++;
        mLength--;
        //這里使用的原理和出隊(duì)是一樣的可以看一下上面:)
        mHead = mHead%mCapacity;
        return t;
    }
    /**
     * 遍歷當(dāng)前隊(duì)列全部對象
     *@date 2017年10月24日 下午5:30:25
     */
    public void traverseQueue(){
        for (int i = mHead; i < mHead+mLength; i++) { 
            doSomething((T)mQueue[i%mCapacity]); 
        }
    }
    /**
     * 具體處理隊(duì)列對象的方法
     * 這里使用抽象方法因?yàn)椋?     * 對于對象的具體處理邏輯各不相同,所以具體實(shí)現(xiàn)交給用戶自己去完成
     *@date 2017年10月24日 下午5:30:41
     */
    public abstract void doSomething(T t);
}

測試代碼

package ss;

public class TestDemo {
    public static void main(String[] args) {
        MyQueue<A> a=new MyQueue<A>(5){
            @Override
            public void doSomething(A t) {
                System.out.println(t.toString());
            }
            
        };
        A a1=new A(1,"a1");
        A a2=new A(2,"a2");
        A a3=new A(3,"a3");
        A a4=new A(4,"a4");
        A a5=new A(5,"a5");
        A a6=new A(6,"a6");
        a.EnQueue(a1);
        a.EnQueue(a2);
        a.EnQueue(a3);
        a.EnQueue(a4);
        a.EnQueue(a5);
        a.EnQueue(a6);
        
        a.traverseQueue();
        System.out.println("-----------------------------------------------------");
        a.DeQueue();
        a.DeQueue();
        a.EnQueue(a6);
        a.traverseQueue();
        
    }
}

因?yàn)槟秸n網(wǎng)的視頻是用c語言寫的,我在簡書上找到了java寫的,代碼來自Rayhaha附上鏈接http://t.cn/RWCfxtF

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

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

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