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

java數(shù)據(jù)結(jié)構(gòu)循環(huán)隊(duì)列的空滿判斷及長(zhǎng)度計(jì)算

 更新時(shí)間:2022年06月06日 10:08:03   作者:把蘋果咬哭的測(cè)試筆記  
這篇文章主要為大家介紹了java數(shù)據(jù)結(jié)構(gòu)循環(huán)隊(duì)列的空滿判斷及長(zhǎng)度計(jì)算,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

上一章中,使用了數(shù)組模擬了隊(duì)列。但是留下的問(wèn)題是,把數(shù)據(jù)取完后,再往里加數(shù)據(jù)就不行了。

一、假溢出

這是因?yàn)閿?shù)組的末尾已經(jīng)被占用了,入隊(duì)會(huì)繼續(xù)在數(shù)組后面增加,于是產(chǎn)生數(shù)組越界。但是實(shí)際上,數(shù)組里是有空閑位置的,這種也可以叫“假溢出”。

為了解決“假溢出”的問(wèn)題,于是乎有了循環(huán)隊(duì)列。

既然數(shù)組后面滿了,頭部有空,那繼續(xù)加進(jìn)來(lái)的元素從頭開(kāi)始放即可。

接著上圖,這時(shí)候有a6入隊(duì),于是rear的下標(biāo)指向a6的下一個(gè)元素位置,看起來(lái)沒(méi)什么問(wèn)題。

但是繼續(xù)有新的元素a7入隊(duì)的時(shí)候,因?yàn)閒ront一直沒(méi)變,這時(shí)候rear指針跟front就重合了,也就是說(shuō)此時(shí)front=rear。

可是在上一章的代碼里,我們是用front=rear來(lái)判斷是否為空數(shù)組的。

// 判斷隊(duì)列是否為空
    public boolean isEmpty() {
        return rear == front;
    }

現(xiàn)在是相等了,條件滿足,但是數(shù)組是滿的。

二、循環(huán)隊(duì)列判斷是空是滿

這種情況看起來(lái)確實(shí)比較辣手,那如果不讓這種情況出現(xiàn)不就可以了么?

假設(shè),我們讓數(shù)組始終保留一個(gè)元素空間,也就是讓rear指向隊(duì)列中最后一個(gè)元素的后一個(gè)位置。比如,當(dāng)a6放入之后,此時(shí)就當(dāng)做隊(duì)列已經(jīng)滿了,這樣的話就不會(huì)出現(xiàn)上述的情況了。

為了實(shí)現(xiàn)這種思路,front也需要做調(diào)整。在上一章中,front初始位置是指在了隊(duì)頭元素的前一個(gè),現(xiàn)在我們讓它就指在第一個(gè)元素。

隊(duì)列的最大尺寸還是maxSize,那么,現(xiàn)在判斷隊(duì)列滿的條件就可以是這樣:

(rear+1)%maxSize = front

驗(yàn)證一下,下面的2種隊(duì)列滿情況:

左圖:隊(duì)列中,maxSize=5,front=0,rear=4,判斷(4+1)% 5=0=front,隊(duì)列已滿

右圖:隊(duì)列中,maxSize=5,front=2,rear=1,判斷(1+1)% 5=2=front,隊(duì)列已滿

繼續(xù)驗(yàn)證一下,隊(duì)列沒(méi)滿的情況:

隊(duì)列中,maxSize=5,front=2,rear=0,判斷(0+1)% 5=1≠front,隊(duì)列未滿

三、循環(huán)隊(duì)列的長(zhǎng)度計(jì)算

隊(duì)列的長(zhǎng)度,也就是說(shuō)隊(duì)列中實(shí)際存了多少個(gè)元素。

此時(shí)需要考慮rear與front之間的三種情況:

  • rear=front
  • rear>front
  • rear<front

第一種自然都清楚,隊(duì)列為空。

第二種,rear>front,此時(shí)隊(duì)列的長(zhǎng)度為:rear-front

第三種,rear<front,比較復(fù)雜些。隊(duì)列長(zhǎng)度分為2段:一段是maxSize-front,另一段則是:0+rear(結(jié)合右圖理解)。故此時(shí)隊(duì)列總長(zhǎng)度為兩段相加:rear-front+maxSize

所以隊(duì)列長(zhǎng)度的通用計(jì)算公式為:

(rear-front+maxSize)% maxSize

四、代碼實(shí)現(xiàn)

既然現(xiàn)在隊(duì)列是滿是空的判斷條件有了,隊(duì)列長(zhǎng)度也能計(jì)算出來(lái)了,那么代碼就好改造了(基于上一章),變成循環(huán)隊(duì)列。

package circle;
import java.util.Scanner;
public class CircleArrayQueue {
    public static void main(String[] args) {
        System.out.println("-----測(cè)試循環(huán)隊(duì)列-----");
        // 創(chuàng)建一個(gè)隊(duì)列
        CircleArray circleArray = new CircleArray(4);
        char key = ' '; //接受用戶輸入
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;
        // 輸出一個(gè)菜單
        while (loop) {
            System.out.println("s(show): 顯示隊(duì)列");
            System.out.println("e(exit): 退出程序");
            System.out.println("a(add): 添加數(shù)據(jù)到隊(duì)列");
            System.out.println("g(get): 從隊(duì)列取出數(shù)據(jù)");
            System.out.println("h(head): 顯示隊(duì)首的數(shù)據(jù)");
            key = scanner.next().charAt(0); // 接收一個(gè)字符
            switch (key) {
                case 's':
                    circleArray.showQueue();
                    break;
                case 'a':
                    System.out.println("請(qǐng)要添加的數(shù)");
                    int value = scanner.nextInt();
                    circleArray.addQueue(value);
                    break;
                case 'g':
                    try {
                        int res = circleArray.getQueue();
                        System.out.printf("取出的數(shù)據(jù)是:%d", res);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h':
                    try {
                        int headValue = circleArray.showHeadQueue();
                        System.out.printf("隊(duì)首數(shù)據(jù)是:%d", headValue);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e':
                    scanner.close();
                    loop = false;
                    break;
            }
        }
        System.out.println("退出程序");
    }
}
class CircleArray {
    //表示數(shù)組最大容量
    private int maxSize;
    // 隊(duì)列頭,由之前調(diào)整為指向隊(duì)列第一個(gè)元素
    private int front;
    // 隊(duì)列尾,由之前調(diào)整為指向隊(duì)列最后一個(gè)元素的后一個(gè)位置,為了空出一個(gè)元素位置
    private int rear;
    // 用于存放數(shù)據(jù)的數(shù)組
    private int[] arr;
    // 構(gòu)造器
    public CircleArray(int arrMaxSize) {
        maxSize = arrMaxSize;
        arr = new int[maxSize];
        front = 0;
        rear = 0;
    }
    // 判斷隊(duì)列是否已經(jīng)存滿
    public boolean isFull() {
        return (rear + 1) % maxSize == front;
    }
    // 判斷隊(duì)列是否為空
    public boolean isEmpty() {
        return rear == front;
    }
    // 添加數(shù)據(jù)到隊(duì)列
    public void addQueue(int num) {
        // 判斷隊(duì)列是否滿了
        if (isFull()) {
            System.out.println("隊(duì)列已滿,不可加入數(shù)據(jù)");
            return;
        }
        arr[rear] = num;
        // 將rear后移,要考慮取模
        rear = (rear + 1) % maxSize;
    }
    // 拿出隊(duì)列數(shù)據(jù)
    public int getQueue() {
        // 判斷隊(duì)列是否空
        if (isEmpty()) {
            // 拋出異常
            throw new RuntimeException("隊(duì)列為空,不可取數(shù)據(jù)");
        }
        int tempValue = arr[front];
        front = (front + 1) % maxSize; //也要考慮取模,防止front不停的增加,導(dǎo)致越界
        return tempValue;
    }
    // 顯示隊(duì)列所有數(shù)據(jù)
    public void showQueue() {
        // 遍歷
        if (isEmpty()) {
            System.out.println("隊(duì)列為空");
            return;
        }
        // 從front開(kāi)始遍歷,遍歷多少個(gè)實(shí)際存的元素即可
        for (int i = front; i < front + CircleQueueSize(); i++) {
            System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);
        }
    }
    // 求出當(dāng)前隊(duì)列有效數(shù)據(jù)的個(gè)數(shù)
    public int CircleQueueSize() {
        return (rear - front + maxSize) % maxSize;
    }
    // 顯示隊(duì)里的隊(duì)首數(shù)據(jù)
    public int showHeadQueue() {
        if (isEmpty()) {
            // 拋出異常
            throw new RuntimeException("隊(duì)列為空,不可取數(shù)據(jù)");
        }
        return arr[front];
    }
}

重點(diǎn)的改動(dòng)在于取模。

以上就是java數(shù)據(jù)結(jié)構(gòu)循環(huán)隊(duì)列的空滿判斷及長(zhǎng)度計(jì)算的詳細(xì)內(nèi)容,更多關(guān)于java循環(huán)隊(duì)列空滿判斷長(zhǎng)度計(jì)算的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springBoot項(xiàng)目中的static和templates文件夾的使用

    springBoot項(xiàng)目中的static和templates文件夾的使用

    本文主要介紹了springBoot項(xiàng)目中的static和templates文件夾的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • Java命名規(guī)范

    Java命名規(guī)范

    本文主要介紹了Java命名規(guī)范。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • 淺談Spring如何解決循環(huán)依賴的問(wèn)題

    淺談Spring如何解決循環(huán)依賴的問(wèn)題

    這篇文章主要介紹了淺談Spring如何解決循環(huán)依賴的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Linux系統(tǒng)卸載重裝JDK的完整流程

    Linux系統(tǒng)卸載重裝JDK的完整流程

    Linux系統(tǒng)有時(shí)候會(huì)默認(rèn)使用OpenJDK版本,需要卸載后重新安裝自己需要的JDK版本,下面這篇文章主要給大家介紹了關(guān)于Linux系統(tǒng)卸載重裝JDK的完整流程,需要的朋友可以參考下
    2024-02-02
  • 如何在Java中優(yōu)雅地判空詳解

    如何在Java中優(yōu)雅地判空詳解

    這篇文章主要大家介紹了關(guān)于如何在Java中優(yōu)雅地判空的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 一個(gè)Java中BigDecimal的問(wèn)題記錄

    一個(gè)Java中BigDecimal的問(wèn)題記錄

    這篇文章主要給大家介紹了關(guān)于Java中一個(gè)BigDecimal問(wèn)題的相關(guān)資料,通過(guò)文中介紹的方法可以很方便的解決BigDecimal進(jìn)行計(jì)算的時(shí)候不管怎么計(jì)算,最后得到的值都沒(méi)有變化的問(wèn)題,需要的朋友可以參考下
    2021-11-11
  • 8張圖帶你全面了解Java?kafka的核心機(jī)制

    8張圖帶你全面了解Java?kafka的核心機(jī)制

    kafka是目前企業(yè)中很常用的消息隊(duì)列產(chǎn)品,可以用于削峰、解耦、異步通信,本文就通過(guò)幾張圖帶大家全面認(rèn)識(shí)一下kafka,現(xiàn)在我們不妨帶入kafka設(shè)計(jì)者的角度去思考該如何設(shè)計(jì),它的架構(gòu)是怎么樣的、都有哪些組件組成、如何進(jìn)行擴(kuò)展等等,需要的朋友可以參考下
    2023-05-05
  • java實(shí)現(xiàn)爬蟲(chóng)爬網(wǎng)站圖片的實(shí)例代碼

    java實(shí)現(xiàn)爬蟲(chóng)爬網(wǎng)站圖片的實(shí)例代碼

    這篇文章主要介紹了java實(shí)現(xiàn)爬蟲(chóng)爬網(wǎng)站圖片的實(shí)例代碼,需要的朋友可以參考下
    2018-06-06
  • Java回調(diào)函數(shù)與觀察者模式實(shí)例代碼

    Java回調(diào)函數(shù)與觀察者模式實(shí)例代碼

    這篇文章主要介紹了Java回調(diào)函數(shù)與觀察者模式實(shí)例代碼,簡(jiǎn)單介紹了使用觀察者模式的場(chǎng)景,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • 淺談sql_@SelectProvider及使用注意說(shuō)明

    淺談sql_@SelectProvider及使用注意說(shuō)明

    這篇文章主要介紹了sql_@SelectProvider及使用注意說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評(píng)論

滨州市| 保康县| 古浪县| 凤城市| 荣成市| 阿瓦提县| 永安市| 谢通门县| 仁寿县| 淅川县| 雷山县| 封丘县| 万宁市| 宜兴市| 葫芦岛市| 余江县| 五台县| 黎平县| 扎赉特旗| 罗平县| 青浦区| 神木县| 安义县| 四川省| 汤原县| 临桂县| 平江县| 东宁县| 遂宁市| 乌海市| 肥西县| 五指山市| 怀仁县| 辰溪县| 湟源县| 灵川县| 滦南县| 吉安市| 沂南县| 华宁县| 桑日县|