最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?循環(huán)隊(duì)列/環(huán)形隊(duì)列的實(shí)現(xiàn)流程

 更新時(shí)間:2022年02月14日 15:12:59   作者:Word碼鴨  
循環(huán)隊(duì)列又叫環(huán)形隊(duì)列,是一種特殊的隊(duì)列。循環(huán)隊(duì)列解決了隊(duì)列出隊(duì)時(shí)需要將所有數(shù)據(jù)前移一位的問題。本文將帶大家詳細(xì)了解循環(huán)隊(duì)列如何實(shí)現(xiàn),需要的朋友可以參考一下

之前,我們使用鏈表實(shí)現(xiàn)了基礎(chǔ)隊(duì)列,鏈接放在這里可以去康康喲

Java棧和基礎(chǔ)隊(duì)列的實(shí)現(xiàn)詳解

之所以沒有選擇數(shù)組來實(shí)現(xiàn),是因?yàn)槊坑幸粋€(gè)元素出隊(duì),數(shù)組中所有剩下的元素都需要向前移動(dòng)一次,因此沒有鏈表高效。

此時(shí),我們就引出了循環(huán)隊(duì)列的概念。

循環(huán)隊(duì)列,又稱環(huán)形隊(duì)列,邏輯上是一個(gè)環(huán),物理上依然是線性表。

head-指向隊(duì)列的第一個(gè)元素

tail-指向隊(duì)列最后一個(gè)元素的下一個(gè)位置

當(dāng)tail走到數(shù)組末尾時(shí),下一步再次返回?cái)?shù)組頭部(從0開始)

出隊(duì)之后的元素就訪問不到了,此時(shí)邏輯上已經(jīng)將它刪除了,tail向后走到該位置時(shí)覆蓋它即可。此時(shí)就解決了數(shù)組隊(duì)列需要一直搬運(yùn)元素的問題。

了解循環(huán)隊(duì)列的概念之后,我們就能明白它的幾個(gè)基礎(chǔ)知識(shí):

當(dāng)head == tail 時(shí),表示隊(duì)列為空

根據(jù)上面 head 和 tail 的定義,隊(duì)列已滿時(shí),tail 指向最后一個(gè)元素的下一個(gè)位置,也就是head ,此時(shí)我們就無法區(qū)分環(huán)形隊(duì)列到底是已滿還是為空。所以我們?cè)诃h(huán)形隊(duì)列的數(shù)組中浪費(fèi)一個(gè)空間,在區(qū)分?jǐn)?shù)組是否已滿,如下圖,就是一個(gè)已滿的隊(duì)列

那么如何移動(dòng) tail 指針使他返回?cái)?shù)組頭部呢?我們運(yùn)用取模操作:

tail = ( tail + 1 ) % 數(shù)組.length; 

根據(jù)上式我們就能判斷隊(duì)列是否已滿的方法:

( tail + 1 ) % 數(shù)組.length == head; 

此時(shí) head 和 tail 引用向后移動(dòng)時(shí),不能簡單的 +1,要 ++ 之后對(duì)數(shù)組長度取模,這樣就可以返回?cái)?shù)組頭部繼續(xù)向后移動(dòng):

 head = ( head +1 ) % 數(shù)組.length;

tail = ( tail +1 ) % 數(shù)組.length;

那么如何獲取當(dāng)前隊(duì)列最后一個(gè)元素的索引呢?

圖①中最后一個(gè)元素的索引就是 tail -1

圖②的tail恰好在數(shù)組第一個(gè)位置,這時(shí)最后一個(gè)元素下標(biāo)就是 數(shù)組.length -1

綜上:數(shù)組最后一個(gè)元素的索引lastIndex

lastIndex = tail == 0 ? 數(shù)組.length -1 : tail -1;

代碼實(shí)現(xiàn):

public interface Queue<E> {
    void offer(E val);//入隊(duì)
    E poll();//出隊(duì),返回出隊(duì)的值
    E peek();//返回隊(duì)首元素
    boolean isEmpty();//判斷是否為空
}
 
 
import java.util.NoSuchElementException;
 
//基于整型的循環(huán)隊(duì)列
public class LoopQueue implements Queue<Integer>{
    private Integer[] data;
    private int head;//隊(duì)首元素
    private int tail;//隊(duì)尾元素的下一個(gè)位置
    private int size;//當(dāng)前元素個(gè)數(shù)
    public LoopQueue(int n){
        //n為希望保存的元素個(gè)數(shù)
        //在循環(huán)隊(duì)列中要浪費(fèi)一個(gè)元素空間,來判斷是否已滿,所以 +1
        data = new Integer[n + 1];
        }
 
    @Override
    //添加元素
    public void offer(Integer val) {
        if(isFull()){
            throw new ArrayIndexOutOfBoundsException("queue is full, cannot offer new val");
        }
        data[tail] = val;
        //tail向后移
        tail = (tail + 1) % data.length;
        size++;
    }
 
    @Override
    //出隊(duì)
    public Integer poll() {
        if (isEmpty()){
            throw new NoSuchElementException("queues empty!cannot poll");
        }
        Integer val = data[head];
        //head向后移動(dòng)
        head = (head + 1) % data.length;
        size--;
        return val;
    }
 
    @Override
    public Integer peek() {
        if (isEmpty()){
            throw new NoSuchElementException("queues empty!cannot poll");
        }
        return data[head];
    }
 
    @Override
    //判斷是否為空
    public boolean isEmpty() {
        return tail == head;
    }
    public String toString(){
        StringBuilder sb = new StringBuilder();
        sb.append("front[");
        //取得最后一個(gè)元素的下標(biāo)
        int lastIndex = tail == 0 ? data.length-1 : tail-1;
        for (int i = head; i != tail; ) {
            sb.append(data[i]);
            if (i != lastIndex){
                sb.append(",");
            }
            i = (i+1) % data.length;
 
        }
        sb.append("]tail");
        return sb.toString();
    }
    //判斷隊(duì)列是否已滿
    public boolean isFull(){
        return (tail + 1) % data.length == head;
    }
}
//代碼測試
public class LoopQueueTest {
    public static void main(String[] args) {
        Queue<Integer> loopQueue = new LoopQueue(5);
        for (int i = 0; i < 5; i++) {
            loopQueue.offer(i+1);
        }
        System.out.println(loopQueue);
//        loopQueue.offer(1);
        System.out.println(loopQueue.poll());
        System.out.println(loopQueue);
    }
}

運(yùn)行結(jié)果:

到此這篇關(guān)于Java 循環(huán)隊(duì)列/環(huán)形隊(duì)列的實(shí)現(xiàn)流程的文章就介紹到這了,更多相關(guān)Java 循環(huán)隊(duì)列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Spark?Sql在UDF中如何引用外部數(shù)據(jù)

    詳解Spark?Sql在UDF中如何引用外部數(shù)據(jù)

    這篇文章主要為大家介紹了詳解Spark?Sql在UDF中如何引用外部數(shù)據(jù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Hadoop集成Spring的使用詳細(xì)教程(快速入門大數(shù)據(jù))

    Hadoop集成Spring的使用詳細(xì)教程(快速入門大數(shù)據(jù))

    這篇文章主要介紹了Hadoop集成Spring的使用詳細(xì)教程(快速入門大數(shù)據(jù)),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • java生成圖片進(jìn)行套打功能

    java生成圖片進(jìn)行套打功能

    這篇文章主要為大家詳細(xì)介紹了java生成圖片進(jìn)行套打功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 使用Spring-Retry解決Spring Boot應(yīng)用程序中的重試問題

    使用Spring-Retry解決Spring Boot應(yīng)用程序中的重試問題

    重試的使用場景比較多,比如調(diào)用遠(yuǎn)程服務(wù)時(shí),由于網(wǎng)絡(luò)或者服務(wù)端響應(yīng)慢導(dǎo)致調(diào)用超時(shí),此時(shí)可以多重試幾次。用定時(shí)任務(wù)也可以實(shí)現(xiàn)重試的效果,但比較麻煩,用Spring Retry的話一個(gè)注解搞定所有,感興趣的可以了解一下
    2023-04-04
  • springboot整合mybatis-plus逆向工程的實(shí)現(xiàn)

    springboot整合mybatis-plus逆向工程的實(shí)現(xiàn)

    這篇文章主要介紹了springboot整合mybatis-plus逆向工程的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • java notify和notifyAll的對(duì)比

    java notify和notifyAll的對(duì)比

    這篇文章主要介紹了 java notify和notifyAll的對(duì)比的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • java基礎(chǔ)學(xué)習(xí)筆記之泛型

    java基礎(chǔ)學(xué)習(xí)筆記之泛型

    所謂泛型,就是變量類型的參數(shù)化。泛型是JDK1.5中一個(gè)最重要的特征。通過引入泛型,我們將獲得編譯時(shí)類型的安全和運(yùn)行時(shí)更小的拋出ClassCastException的可能。在JDK1.5中,你可以聲明一個(gè)集合將接收/返回的對(duì)象的類型。
    2016-02-02
  • Java解析xml文件遇到特殊符號(hào)異常的情況(處理方案)

    Java解析xml文件遇到特殊符號(hào)異常的情況(處理方案)

    這篇文章主要介紹了Java解析xml文件遇到特殊符號(hào)&會(huì)出現(xiàn)異常的解決方案,實(shí)現(xiàn)思路很簡單通過在讀取xml文件使用SAX解析前讀取reader,具體實(shí)現(xiàn)方法及示例代碼跟隨小編一起看看吧
    2021-05-05
  • 從零開始學(xué)JAVA之可變參數(shù)

    從零開始學(xué)JAVA之可變參數(shù)

    本文是從零開始學(xué)JAVA的第一篇,屬于Java基礎(chǔ)知識(shí)介紹的第一部分,主要介紹Java的可變參數(shù),非常使用,希望對(duì)大家有所幫助
    2014-10-10
  • Java并發(fā)編程ThreadLocalRandom類詳解

    Java并發(fā)編程ThreadLocalRandom類詳解

    這篇文章主要介紹了Java并發(fā)編程ThreadLocalRandom類詳解,通過提出問題為什么需要ThreadLocalRandom展開詳情,感興趣的朋友可以參考一下
    2022-06-06

最新評(píng)論

松江区| 吉首市| 长阳| 奎屯市| 桐城市| 牡丹江市| 福鼎市| 灌云县| 永修县| 宝清县| 忻州市| 南投县| 读书| 宜宾市| 五莲县| 尚志市| 云龙县| 温宿县| 芜湖县| 石嘴山市| 谷城县| 察哈| 淳化县| 宁河县| 南召县| 泾阳县| 托克托县| 正安县| 阜平县| 高州市| 阜宁县| 寻乌县| 荥阳市| 茶陵县| 出国| 台山市| 天等县| 和龙市| 邵武市| 鹤庆县| 梁平县|