欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java數(shù)據(jù)結構循環(huán)隊列的空滿判斷及長度計算

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

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

一、假溢出

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

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

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

接著上圖,這時候有a6入隊,于是rear的下標指向a6的下一個元素位置,看起來沒什么問題。

但是繼續(xù)有新的元素a7入隊的時候,因為front一直沒變,這時候rear指針跟front就重合了,也就是說此時front=rear。

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

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

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

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

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

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

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

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

(rear+1)%maxSize = front

驗證一下,下面的2種隊列滿情況:

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

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

繼續(xù)驗證一下,隊列沒滿的情況:

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

三、循環(huán)隊列的長度計算

隊列的長度,也就是說隊列中實際存了多少個元素。

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

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

第一種自然都清楚,隊列為空。

第二種,rear>front,此時隊列的長度為:rear-front

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

所以隊列長度的通用計算公式為:

(rear-front+maxSize)% maxSize

四、代碼實現(xiàn)

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

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

重點的改動在于取模。

以上就是java數(shù)據(jù)結構循環(huán)隊列的空滿判斷及長度計算的詳細內容,更多關于java循環(huán)隊列空滿判斷長度計算的資料請關注腳本之家其它相關文章!

相關文章

  • 將應用程序進行Spring6遷移的最佳使用方式

    將應用程序進行Spring6遷移的最佳使用方式

    這篇文章主要介紹了將應用程序進行Spring6遷移的最佳方式,以及如何充分利用此升級,需要的朋友可以參考下,如有錯誤的地方還請指正
    2023-03-03
  • Resttemplate中設置超時時長方式

    Resttemplate中設置超時時長方式

    這篇文章主要介紹了Resttemplate中設置超時時長方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 詳解Java使用Jsch與sftp服務器實現(xiàn)ssh免密登錄

    詳解Java使用Jsch與sftp服務器實現(xiàn)ssh免密登錄

    這篇文章主要介紹了詳解Java使用Jsch與sftp服務器實現(xiàn)ssh免密登錄,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • 通過Java壓縮JavaScript代碼實例分享

    通過Java壓縮JavaScript代碼實例分享

    這篇文章主要介紹了通過Java壓縮JavaScript代碼實例分享,具有一定參考價值,需要的朋友可以了解下。
    2017-12-12
  • Dubbo擴展點SPI實踐示例解析

    Dubbo擴展點SPI實踐示例解析

    這篇文章主要為大家介紹了Dubbo擴展點SPI實踐示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 一篇文章帶你深入了解Java類加載

    一篇文章帶你深入了解Java類加載

    這篇文章主要介紹了Java中類加載過程全面解析,具有一定參考價值,需要的朋友可以了解下,希望能給你帶來幫助
    2021-08-08
  • List集合按某個屬性或者字段進行分組的操作

    List集合按某個屬性或者字段進行分組的操作

    這篇文章主要介紹了List集合按某個屬性或者字段進行分組的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java8中Optional的一些常見錯誤用法總結

    Java8中Optional的一些常見錯誤用法總結

    我們知道 Java 8 增加了一些很有用的 API, 其中一個就是 Optional,下面這篇文章主要給大家介紹了關于Java8中Optional的一些常見錯誤用法的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-07-07
  • 如何使用 Shell 腳本查看多個服務器的端口是否打開的方法

    如何使用 Shell 腳本查看多個服務器的端口是否打開的方法

    這篇文章主要介紹了如何使用 Shell 腳本來查看多個服務器的端口是否打開的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • java SpringSecurity使用詳解

    java SpringSecurity使用詳解

    這篇文章主要介紹了java中Spring Security的實例詳解的相關資料,spring security是一個多方面的安全認證框架,提供了基于JavaEE規(guī)范的完整的安全認證解決方案,需要的朋友可以參考下
    2021-08-08

最新評論