數(shù)據(jù)結(jié)構(gòu)(五)用兩種方式簡(jiǎn)單實(shí)現(xiàn)隊(duì)列

數(shù)據(jù)結(jié)構(gòu)(一)數(shù)組實(shí)現(xiàn)一個(gè)簡(jiǎn)單的ArrayList
數(shù)據(jù)結(jié)構(gòu)(二)鏈表實(shí)現(xiàn)LinkedList
數(shù)據(jù)結(jié)構(gòu)(三)用兩種方式簡(jiǎn)單實(shí)現(xiàn)棧
數(shù)據(jù)結(jié)構(gòu)(四)棧和隊(duì)列的簡(jiǎn)單應(yīng)用
數(shù)據(jù)結(jié)構(gòu)(五)用兩種方式簡(jiǎn)單實(shí)現(xiàn)隊(duì)列
數(shù)據(jù)結(jié)構(gòu)(六)BST二分搜索樹(shù)(上)
數(shù)據(jù)結(jié)構(gòu)(六)BST二分搜索樹(shù)(下)
數(shù)據(jù)結(jié)構(gòu)(七)兩種方式實(shí)現(xiàn)set
數(shù)據(jù)結(jié)構(gòu)(八)兩種方式實(shí)現(xiàn)map
數(shù)據(jù)結(jié)構(gòu)(九)set解決LeetCode349號(hào)問(wèn)題

概念

隊(duì)列(queue):只允許在一端進(jìn)行插入操作断楷,而在另一端進(jìn)行刪除操作的線(xiàn)性表燃乍。
隊(duì)列是一種先進(jìn)先出(First In First Out)的線(xiàn)性表痕钢,簡(jiǎn)稱(chēng)FIFO挑童。
允許插入的一端稱(chēng)為隊(duì)尾,允許刪除的一端稱(chēng)為隊(duì)頭

實(shí)現(xiàn)隊(duì)列的簡(jiǎn)單的幾個(gè)方法:

public interface Queue<E> {
    int getSize();
    boolean isEmpty();
    //插入隊(duì)列
    void enqueue(E e);
    //刪除隊(duì)列隊(duì)首元素
    E dequeue();
    / /獲取隊(duì)首元素
    E getFront();
}

實(shí)現(xiàn)隊(duì)列

1.array實(shí)現(xiàn)隊(duì)列源碼如下:

public class ArrayQueue<E> implements Queue<E>{
    private Array<E> array;

    public ArrayQueue(int capacity){
        array = new Array<>(capacity);
    }

    public ArrayQueue(){
        array = new Array<>();
    }

    @Override
    public int getSize() {
        return array.getSize();
    }

    @Override
    public boolean isEmpty() {
        return array.isEmpty();
    }

    public int getCapacity(){
        return array.getCapacity();
    }


    @Override
    public void enqueue(E e) {
        array.addLast(e);
    }

    @Override
    public E dequeue() {
        return array.removeFirst();
    }

    @Override
    public E getFront() {
        return array.getFirst();
    }
    @Override
    public String toString(){
        StringBuilder res = new StringBuilder();
        res.append("queue ");
        res.append("front [");
        for (int i = 0; i<array.getSize() ; i ++){
            res.append(array.get(i));
            if (i != array.getSize() - 1){
                res.append(",");
            }
        }
        res.append("] tail");
        return res.toString();
    }
    public static void main(String[] args) {
        ArrayQueue<Integer> arrayQueue = new ArrayQueue<>();
        for (int i = 0; i < 10; i++) {
            arrayQueue.enqueue(i);
            System.out.println(arrayQueue);

            if (i % 3 == 2){
                arrayQueue.dequeue();
                System.out.println(arrayQueue);
            }
        }
    }
}

這幾個(gè)方法很簡(jiǎn)單沒(méi)有什么需要解釋的糕非,array里直接實(shí)現(xiàn)了蒙具。下邊我們來(lái)看看鏈表實(shí)現(xiàn)隊(duì)列

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

public class LinkedListQueue<E> implements Queue<E> {

    private class Node {
        private E e;
        private Node next;

        public Node(E e, Node next) {
            this.e = e;
            this.next = next;
        }

        public Node(E e) {
            this(e, null);
        }

        public Node() {
            this(null, null);
        }

        @Override
        public String toString() {
            return e.toString();
        }
    }

    private Node head, tail;
    private int size = 0;

    public LinkedListQueue() {
        head = null;
        tail = null;
        size = 0;
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public void enqueue(E e) {
        if (tail == null) {
            tail = new Node(e);
            head = tail;
        } else {
            tail.next = new Node(e);
            tail = tail.next;
        }

        size++;
    }

    @Override
    public E dequeue() {
        if (isEmpty()) {
            throw new IllegalArgumentException("can not dequeue from a empty queue");
        }
        Node retNode = head;
        head = head.next;
        retNode.next = null;
        if (head == null) {
            tail = null;
        }
        size--;
        return retNode.e;
    }

    @Override
    public E getFront() {
        if (isEmpty()) {
              throw new IllegalArgumentException("can not dequeue from a empty queue");
        }
        return head.e;
    }

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append("queue :front ");
        Node cur = head;
        while (cur.next != null) {
            res.append(cur.e);
            cur = cur.next;
        }
        res.append("NULL  tail");
        return res.toString();
    }

這里定義了一個(gè)頭節(jié)點(diǎn),一個(gè)尾節(jié)點(diǎn)朽肥,

  • enqueue插入元素的時(shí)候先判斷當(dāng)前鏈表是否為空店量,如果為空,這個(gè)元素的節(jié)點(diǎn)賦值給頭尾節(jié)點(diǎn)鞠呈;如果鏈表不為空融师,創(chuàng)建一個(gè)節(jié)點(diǎn)插入到尾結(jié)點(diǎn),把尾結(jié)點(diǎn)賦值成剛才創(chuàng)建的節(jié)點(diǎn)蚁吝。
  • dequeue 首先判斷一下這個(gè)鏈表是否為空旱爆,如果是空的則拋一個(gè)異常,如果不為空就然后創(chuàng)建一個(gè)臨時(shí)節(jié)點(diǎn)把頭節(jié)點(diǎn)賦值給他窘茁,頭結(jié)點(diǎn)指向下一個(gè)節(jié)點(diǎn)怀伦,臨時(shí)節(jié)點(diǎn)賦值為null;如果刪除之前鏈表里只有一個(gè)節(jié)點(diǎn)山林,那么刪除之后鏈表就為空了房待,頭尾節(jié)點(diǎn)都為null,所以后邊加了一個(gè)判斷。
  • getFront 獲取頭結(jié)點(diǎn)的元素這個(gè)方法很簡(jiǎn)單桑孩,只需要判斷一下當(dāng)前鏈表是否為空拜鹤。
  • toString方法也很簡(jiǎn)單,只是要在頭和尾節(jié)點(diǎn)拼接一寫(xiě)我們可以看清楚的提示性文字流椒,剩下的就是遍歷一下鏈表敏簿。

到這里兩種隊(duì)列的實(shí)現(xiàn)方式已經(jīng)介紹完了,下邊會(huì)為大家分析一下他們的時(shí)間復(fù)雜度宣虾。希望大家多多支持惯裕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市绣硝,隨后出現(xiàn)的幾起案子蜻势,更是在濱河造成了極大的恐慌,老刑警劉巖鹉胖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件握玛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡次员,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)王带,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)淑蔚,“玉大人,你說(shuō)我怎么就攤上這事愕撰∩采溃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵搞挣,是天一觀的道長(zhǎng)带迟。 經(jīng)常有香客問(wèn)我,道長(zhǎng)囱桨,這世上最難降的妖魔是什么仓犬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮舍肠,結(jié)果婚禮上搀继,老公的妹妹穿的比我還像新娘。我一直安慰自己翠语,他們只是感情好叽躯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著肌括,像睡著了一般点骑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天黑滴,我揣著相機(jī)與錄音憨募,去河邊找鬼。 笑死跷跪,一個(gè)胖子當(dāng)著我的面吹牛馋嗜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吵瞻,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼葛菇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了橡羞?” 一聲冷哼從身側(cè)響起眯停,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卿泽,沒(méi)想到半個(gè)月后莺债,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡签夭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年齐邦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片第租。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡措拇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出慎宾,到底是詐尸還是另有隱情丐吓,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布趟据,位于F島的核電站券犁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏汹碱。R本人自食惡果不足惜粘衬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咳促。 院中可真熱鬧色难,春花似錦、人聲如沸等缀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尺迂。三九已至笤妙,卻和暖如春冒掌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹲盘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工股毫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人召衔。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓铃诬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親苍凛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子趣席,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348