數(shù)據(jù)結(jié)構(gòu)之隊(duì)列【數(shù)組,集合耐亏,棧徊都,鏈表來實(shí)現(xiàn)】

1.隊(duì)列實(shí)現(xiàn) (先進(jìn)先出)

  • 用數(shù)組實(shí)現(xiàn)隊(duì)列
public class Queue001 {
    int[] a=new int[10];
    int i=0;
    //入隊(duì)
    public void in(int m){
        a[i++]=m;
    }
     //出隊(duì),先進(jìn)先出
    public int out(){
        int index=0;
        int temp=a[0];//取數(shù)組的第一個(gè)元素出隊(duì)
        for(int j=1;j<i;j++){
            a[j-1]=a[j];//把數(shù)組中剩余的元素前移一位
        }
        return  temp;
    }
}

  • 用集合實(shí)現(xiàn)隊(duì)列
public class Queue002 {
    List<Integer> list=new ArrayList<>();
    int index=0;
    public void in(int n){
        list.add(n);
        index++;
    }
    public int out(){
        if(!list.isEmpty()){
             index--;
             return list.remove(0);//移除并返回 list[0]
        }
        return -1;
    }
}
  • 二個(gè)堆棧實(shí)現(xiàn)隊(duì)列
public class Queue003 {
    Stack<Integer> stackA=new Stack<Integer>();
    Stack<Integer> stackB=new Stack<Integer>();
    public void in(int n){
        stackA.push(n);
    }

     public int out(){
        if(stackB.isEmpty()){ //如果
            while(!stackA.isEmpty()){ //把棧A中元素逐一出棧广辰,并壓入棧B中
                return  stackB.push(stackA.pop());//向讓棧A中元素逐一出棧暇矫,并壓入棧B中
            }
        }
        return  stackB.pop();
    }
}
  • 單鏈表實(shí)現(xiàn)隊(duì)列
public class Queue004<V> {
    private Node<V> head;
    private Node<V> tail;
    private int size;
    public Queue004(){
        tail = head = new Node<V>(null);//初始化頭尾節(jié)點(diǎn)
        size=0;
    }
    //入隊(duì) 添加元素
    public void offer(V value){
        Node<V>  curNode=new Node<V>(value);
        //初始狀態(tài)下,head=tail等價(jià)于head=tail.next=curNode
        tail.next=curNode;//1.只需要保證尾部節(jié)點(diǎn)的next指向curNode即可择吊,
        tail=curNode;//2.尾部節(jié)點(diǎn)變更為當(dāng)前節(jié)點(diǎn)
    }
     //出隊(duì) 獲取元素李根,頭部節(jié)點(diǎn)下移
    public V poll(){
        V temp=null;
        if(head!=null){
            temp=head.value;
            head=head.next;
            size--;
        }
        if(head==null){
            head=tail=null;
        }
        return  temp;
    }
    public class Node<V>{
        public V value;
        public Node<V> next;
        public Node(V v){
            this.value=v;
            next=null;
        }
    }
}

2.MessageQueue隊(duì)列實(shí)現(xiàn)(單鏈表)

  • MessageQueue.enqueueMessage() 入隊(duì)
    //入隊(duì)
    boolean enqueueMessage(Message msg, long when) {
        if (msg.target == null) {
            throw new IllegalArgumentException("Message must have a target.");
        }
        synchronized (this) {
            if (msg.isInUse()) {
                throw new IllegalStateException(msg + " This message is already in use.");
            }
            if (mQuitting) {
                IllegalStateException e = new IllegalStateException(
                        msg.target + " sending message to a Handler on a dead thread");
                Log.w(TAG, e.getMessage(), e);
                msg.recycle();
                return false;
            }
            msg.markInUse();
            msg.when = when;
            Message p = mMessages; //head結(jié)點(diǎn)
            boolean needWake;
            if (p == null || when == 0 || when < p.when) {
                msg.next = p;
                mMessages = msg; //第一個(gè)節(jié)點(diǎn)保存為head結(jié)點(diǎn)
                needWake = mBlocked;
            } else { //head節(jié)點(diǎn)p不等于null
                needWake = mBlocked && p.target == null && msg.isAsynchronous();
                Message prev;
                for (;;) { //死循環(huán),從頭結(jié)點(diǎn)開始遍歷
                    prev = p;//prev保存每一次要遍歷的節(jié)點(diǎn)几睛,最終prev會(huì)變成tail尾部節(jié)點(diǎn)
                    p = p.next;//遍歷
                    if (p == null || when < p.when) {//當(dāng)?shù)阶詈笠粋€(gè)節(jié)點(diǎn) p時(shí)房轿,p.next必然為null
                        break;
                    }
                    if (needWake && p.isAsynchronous()) {
                        needWake = false;
                    }
                }
                msg.next = p; //此時(shí)p=null
                prev.next = msg;//prev節(jié)點(diǎn)變成了tail節(jié)點(diǎn),
            }
            // We can assume mPtr != 0 because mQuitting is false.
            if (needWake) {
                nativeWake(mPtr);
            }
        }
        return true;
    }

  • MessageQueue.next() 出隊(duì)
 Message next() {
        final long ptr = mPtr;
        if (ptr == 0) {
            return null;
        }
        int pendingIdleHandlerCount = -1; // -1 only during first iteration
        int nextPollTimeoutMillis = 0;
        for (;;) {
            if (nextPollTimeoutMillis != 0) {
                Binder.flushPendingCommands();
            }
            nativePollOnce(ptr, nextPollTimeoutMillis);
            synchronized (this) {
                final long now = SystemClock.uptimeMillis();
                Message prevMsg = null;
                Message msg = mMessages;//head節(jié)點(diǎn)
                //target就是handler,過濾掉沒有handler回調(diào)的msg所森,
                if (msg != null && msg.target == null) {
                    do { 
                        prevMsg = msg;
                        msg = msg.next;
                    } while (msg != null && !msg.isAsynchronous());
                }
                //直到msg的target!=null時(shí)
                if (msg != null) {
                    if (now < msg.when) {
                        // Next message is not ready.  Set a timeout to wake up when it is ready.
                        nextPollTimeoutMillis = (int) Math.min(msg.when - now, Integer.MAX_VALUE);
                    } else {
                        // Got a message.
                        mBlocked = false;
                        if (prevMsg != null) {
                            prevMsg.next = msg.next;
                        } else {
                            mMessages = msg.next; 
                        }
                        msg.next = null;
                        if (DEBUG) Log.v(TAG, "Returning message: " + msg);
                        msg.markInUse();
                        return msg; //返回target!=null的msg.
                    }
                } else {
                    // No more messages.
                    nextPollTimeoutMillis = -1;
                }

                // Process the quit message now that all pending messages have been handled.
                if (mQuitting) {
                    dispose();
                    return null;
                }

                // If first time idle, then get the number of idlers to run.
                // Idle handles only run if the queue is empty or if the first message
                // in the queue (possibly a barrier) is due to be handled in the future.
                if (pendingIdleHandlerCount < 0
                        && (mMessages == null || now < mMessages.when)) {
                    pendingIdleHandlerCount = mIdleHandlers.size();
                }
                if (pendingIdleHandlerCount <= 0) {
                    // No idle handlers to run.  Loop and wait some more.
                    mBlocked = true;
                    continue;
                }

                if (mPendingIdleHandlers == null) {
                    mPendingIdleHandlers = new IdleHandler[Math.max(pendingIdleHandlerCount, 4)];
                }
                mPendingIdleHandlers = mIdleHandlers.toArray(mPendingIdleHandlers);
            }

            // Run the idle handlers.
            // We only ever reach this code block during the first iteration.
            for (int i = 0; i < pendingIdleHandlerCount; i++) {
                final IdleHandler idler = mPendingIdleHandlers[i];
                mPendingIdleHandlers[i] = null; // release the reference to the handler

                boolean keep = false;
                try {
                    keep = idler.queueIdle();
                } catch (Throwable t) {
                    Log.wtf(TAG, "IdleHandler threw exception", t);
                }

                if (!keep) {
                    synchronized (this) {
                        mIdleHandlers.remove(idler);
                    }
                }
            }
            pendingIdleHandlerCount = 0;
            nextPollTimeoutMillis = 0;
        }
    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末囱持,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子焕济,更是在濱河造成了極大的恐慌纷妆,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吼蚁,死亡現(xiàn)場離奇詭異凭需,居然都是意外死亡问欠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門粒蜈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顺献,“玉大人,你說我怎么就攤上這事枯怖∽⒄” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵度硝,是天一觀的道長肿轨。 經(jīng)常有香客問我,道長蕊程,這世上最難降的妖魔是什么椒袍? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮藻茂,結(jié)果婚禮上驹暑,老公的妹妹穿的比我還像新娘。我一直安慰自己辨赐,他們只是感情好优俘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掀序,像睡著了一般帆焕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上不恭,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天叶雹,我揣著相機(jī)與錄音,去河邊找鬼县袱。 笑死浑娜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的式散。 我是一名探鬼主播筋遭,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼暴拄!你這毒婦竟也來了漓滔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤乖篷,失蹤者是張志新(化名)和其女友劉穎响驴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撕蔼,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡豁鲤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年秽誊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琳骡。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锅论,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出楣号,到底是詐尸還是另有隱情最易,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布炫狱,位于F島的核電站藻懒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏视译。R本人自食惡果不足惜嬉荆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望憎亚。 院中可真熱鬧员寇,春花似錦弄慰、人聲如沸第美。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽什往。三九已至,卻和暖如春慌闭,著一層夾襖步出監(jiān)牢的瞬間别威,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工驴剔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留省古,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓丧失,卻偏偏與公主長得像豺妓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子布讹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容