成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

數(shù)據(jù)結(jié)構(gòu)與算法——隊(duì)列

OldPanda / 632人閱讀

摘要:概述前面說完了棧,接下來再看看另一種很基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),隊(duì)列。很明顯,隊(duì)列的操作也是受限的,插入元素入隊(duì)只能在隊(duì)尾,刪除元素出隊(duì)只能在隊(duì)頭。這時(shí)候我們需要進(jìn)行數(shù)據(jù)搬移,性能會受到影響,而循環(huán)隊(duì)列解決了這個(gè)問題。

1. 概述

前面說完了棧,接下來再看看另一種很基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),隊(duì)列。顧名思義,隊(duì)列跟我們現(xiàn)實(shí)生活中的排隊(duì)很相似:例如我們在食堂排隊(duì)打飯,先來的先打到,后來的只能一次排在后面,不允許插隊(duì)。很明顯,隊(duì)列的操作也是受限的,插入元素(入隊(duì))只能在隊(duì)尾,刪除元素(出隊(duì))只能在隊(duì)頭。結(jié)合下面的圖就很容易理解了:

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

和棧一樣,隊(duì)列也有兩種實(shí)現(xiàn)方式,使用數(shù)組實(shí)現(xiàn)的隊(duì)列叫做順序隊(duì)列,使用鏈表實(shí)現(xiàn)的隊(duì)列叫做鏈?zhǔn)疥?duì)列。這里我實(shí)現(xiàn)了鏈?zhǔn)疥?duì)列,你也可以根據(jù)其思想使用數(shù)組來實(shí)現(xiàn)。

public class LinkedListQueue {
    
    private Node head;//隊(duì)頭節(jié)點(diǎn)指針
    private Node tail;//隊(duì)尾節(jié)點(diǎn)指針
    private int size;//隊(duì)列中元素個(gè)數(shù)

    public LinkedListQueue() {
        this.head = null;
        this.tail = null;
        this.size = 0;
    }
    
    //入隊(duì)
    public boolean enqueue(String value) {
        Node node = new Node(value);
        if(tail == null) {
            head = tail = node;
            this.size ++;
            return true;
        }
        
        tail.next = node;
        tail = node;
        
        this.size ++;
        return true;
    }
    
    //出隊(duì)列
    public String dequeue() {
        if(head == null) return null;//隊(duì)列為空
        
        String result = head.getData();
        
        head = head.next;
        this.size --;
        return result;
    }
    
    //定義鏈表節(jié)點(diǎn)
    public static class Node{
        private String data;
        private Node next;

        public Node(String data) {
            this.data = data;
            this.next = null;
        }

        public String getData() {
            return data;
        }
    }
}
3. 循環(huán)隊(duì)列

在使用數(shù)組實(shí)現(xiàn)隊(duì)列的時(shí)候,會出現(xiàn)一個(gè)問題,就是隨著隊(duì)頭和隊(duì)尾指針的后移,就算數(shù)組中還有空間,也不能進(jìn)行入隊(duì)操作了。這時(shí)候我們需要進(jìn)行數(shù)據(jù)搬移,性能會受到影響,而循環(huán)隊(duì)列解決了這個(gè)問題。

循環(huán)隊(duì)列就是將數(shù)組首尾相連,形成了一個(gè)環(huán)形:

如上圖,當(dāng)指針 tail 到達(dá)數(shù)組末尾的時(shí)候,并不進(jìn)行數(shù)據(jù)搬移,而是直接將指針向前移,到達(dá)了 0 這個(gè)位置。在進(jìn)行一次入隊(duì),就變成了下面的樣子:

可以看到,循環(huán)隊(duì)列判斷空的條件是 head == tail,而怎么判斷隊(duì)列滿呢?答案是 (tail + 1)== head 的時(shí)候,隊(duì)列就滿了,不能看出循環(huán)隊(duì)列實(shí)際上浪費(fèi)了一個(gè)存儲空間。下面我給出了循環(huán)隊(duì)列的代碼實(shí)現(xiàn):

public class CircularQueue {

    private String[] items;
    private int size;
    private int head;
    private int tail;
    
    public CircularQueue(int capacity) {
        this.items = new String[capacity];
        this.size = 0;
        this.head = 0;
        this.tail = 0;
    }
    
    public CircularQueue() {
        this(16);
    }
    
    //入隊(duì)列
    public boolean enqueue(String value) {
        if((tail + 1) % items.length == head) return false;//隊(duì)列已滿
        
        items[tail] = value;
        //head 和 tail 指針的移動不是簡單的加減1了
        tail = (tail + 1) % items.length;
        this.size ++;
        
        return true;
    }

    //出隊(duì)列
    public String dequeue() {
        if(head ==  tail) return null;//隊(duì)列為空
        
        String result = items[head];
        head = (head + 1) % items.length;
        this.size --;
        
        return result;
    }
    
    //隊(duì)列中元素個(gè)數(shù)
    public int size() {
        return size;
    }

    //打印隊(duì)列中數(shù)據(jù)
    public void print() {
        int h = head;
        int t = tail;
        
        while(h != t) {
            System.out.print(items[h] + "  ");
            h = (h + 1) % items.length;
        }
        System.out.println();
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73733.html

相關(guān)文章

  • 解決“緩存污染”只差這篇文章的距離

    摘要:如果處理不得當(dāng),就會造成緩存污染問題。解決緩存污染的算法算法,英文名,字面意思就是最不經(jīng)常使用的淘汰掉算法,是通過數(shù)據(jù)被訪問的頻率來判斷一個(gè)數(shù)據(jù)的熱點(diǎn)情況。分析降低了緩存污染帶來的問題,命中率比要高。 微信公眾號:IT一刻鐘大型現(xiàn)實(shí)非嚴(yán)肅主義現(xiàn)場一刻鐘與你分享優(yōu)質(zhì)技術(shù)架構(gòu)與見聞,做一個(gè)有劇情的程序員關(guān)注可第一時(shí)間了解更多精彩內(nèi)容,定期有福利相送喲。 showImg(https://s...

    shadowbook 評論0 收藏0
  • 學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)算法之棧隊(duì)列

    摘要:于是翻出了機(jī)房里的這本學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法開始學(xué)習(xí)程序員的基礎(chǔ)知識。這本書用了我最熟悉的來實(shí)現(xiàn)各種數(shù)據(jù)結(jié)構(gòu)和算法,而且書很薄,可以說是一本不錯的入門教程。隊(duì)列在頭部刪除元素,尾部添加元素。 本系列所有文章:第一篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊(duì)列第二篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之鏈表第三篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之集合第四篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之字典和散列表第五篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算...

    pingan8787 評論0 收藏0
  • 學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)算法(一):棧隊(duì)列

    摘要:之?dāng)?shù)組操作接下來就是數(shù)據(jù)結(jié)構(gòu)的第一部分,棧。以字符串顯示棧中所有內(nèi)容方法的實(shí)現(xiàn)說明需要往棧中添加新元素,元素位置在隊(duì)列的末尾。的前端樂園原文鏈接寒假前端學(xué)習(xí)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法,棧與隊(duì)列 本系列的第一篇文章: 學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(一),棧與隊(duì)列第二篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(二):鏈表第三篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(三):集合第...

    Flink_China 評論0 收藏0
  • 每周一練 之 數(shù)據(jù)結(jié)構(gòu)算法(Queue)

    摘要:與堆棧區(qū)別隊(duì)列的操作方式和堆棧類似,唯一的區(qū)別在于隊(duì)列只允許新數(shù)據(jù)在后端進(jìn)行添加。移除隊(duì)列的第一項(xiàng),并返回被移除的元素。三使用隊(duì)列計(jì)算斐波那契數(shù)列的第項(xiàng)。前兩項(xiàng)固定為,后面的項(xiàng)為前兩項(xiàng)之和,依次向后。 showImg(https://segmentfault.com/img/remote/1460000019005270); 這是第二周的練習(xí)題,這里補(bǔ)充下咯,五一節(jié)馬上就要到了,自己的...

    anquan 評論0 收藏0
  • Java數(shù)據(jù)結(jié)構(gòu)算法[原創(chuàng)]——隊(duì)列

    摘要:前言數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時(shí)更新,歡迎各位讀者監(jiān)督。隊(duì)列和棧類似,也是一個(gè)遵循特殊規(guī)則約束的數(shù)據(jù)結(jié)構(gòu)。將沒有元素的隊(duì)列稱之為空隊(duì),往隊(duì)列中插入元素的過程稱之為入隊(duì),從隊(duì)列中移除元素的過程稱之為出隊(duì)。 聲明:碼字不易,轉(zhuǎn)載請注明出處,歡迎文章下方討論交流。 前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時(shí)更新,歡迎各位讀者監(jiān)督。本文介紹數(shù)據(jù)結(jié)構(gòu)中的隊(duì)列(queue)的概念、存儲結(jié)構(gòu)、隊(duì)列的特點(diǎn)...

    韓冰 評論0 收藏0
  • [ JavaScript ] 數(shù)據(jù)結(jié)構(gòu)算法 —— 隊(duì)列

    摘要:而且目前大部分編程語言的高級應(yīng)用都會用到數(shù)據(jù)結(jié)構(gòu)與算法以及設(shè)計(jì)模式。隊(duì)列在尾部添加新元素,并從頂部移除元素。最新添加的元素必須排在隊(duì)列的末尾。 前言 JavaScript是當(dāng)下最流行的編程語言之一,它可以做很多事情: 數(shù)據(jù)可視化(D3.js,Three.js,Chart.js); 移動端應(yīng)用(React Native,Weex,AppCan,Flutter,Hybrid App,小程...

    Yi_Zhi_Yu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<