亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java基礎之數(shù)組模擬循環(huán)隊列

 更新時間:2021年04月28日 10:06:08   作者:在下木子李  
這篇文章主要介紹了Java基礎之數(shù)組模擬循環(huán)隊列,文中有非常詳細的代碼示例,對正在學習java基礎的小伙伴們也有非常好的幫助,需要的朋友可以參考下

一、隊列簡介

隊列是一個有序列表,遵循“先入先出”的原則,即先存入隊列的數(shù)據(jù)要先取出,后存入的數(shù)據(jù)后取出。

隊列有兩種存儲表示,順序表示和鏈式表示。順序表示可以用數(shù)組來實現(xiàn)。

二、數(shù)組模擬隊列

用數(shù)組模擬隊列時,設兩個值front=0,rear=0。front表示隊列首部第一個數(shù)據(jù)所在位置,rear表示尾部最后一個數(shù)據(jù)的下一個位置。

將數(shù)據(jù)插入數(shù)組隊列時(入隊),從尾部進行插入,即array[rear] = value,同時rear后移,rear++。取出數(shù)據(jù)時(出隊),從頭部取出數(shù)據(jù),value = array[front],同時front后移front++。

當front=0,rear=maxSize(數(shù)組的最大長度),隊列滿,不能再存入數(shù)據(jù)。

這時如果執(zhí)行出隊操作,又有空間可以存儲,但繼續(xù)插入數(shù)據(jù),會出現(xiàn)溢出現(xiàn)象,即因數(shù)組越界而導致程序非法操作錯誤。而實際上空間并未占滿,所以稱這種現(xiàn)象為“假溢出”。這是由“隊尾入隊,隊頭出隊”的限制操作所造成的。

如何解決“假溢出”的問題呢?

答案就是循環(huán)隊列。

三、數(shù)組模擬循環(huán)隊列

將順序隊列變?yōu)橐粋€環(huán)狀空間,front、rear和隊列元素之間的關系不變,只是在循環(huán)隊列中,front、rear依次后移加1的操作可用“?!边\算來實現(xiàn)。

通過取模,front、rear就可以在順序表空間內以頭尾銜接的方式“循環(huán)”移動。

元素出隊后,front = (front+1)%maxSize ;
元素入隊后,rear = (rear+1)%maxSize 。

(maxSize為數(shù)組隊列的最大長度)

例如,隊列最大長度為4,當rear=3時,存入數(shù)據(jù),array[3]=value,rear后移一位,如果沒有取模運算,則rear=4,這時繼續(xù)插入數(shù)據(jù),array[4]越界。

如果進行取模運算,rear = (rear+1)%maxSize ,這時rear=0,rear又重新回到了0的位置。這樣的運算,使得rear的值在0、1、2、3之間循環(huán)。

front的值同理。

寫了這么多字,感覺還不如看代碼來得更容易理解一點。

四、代碼實現(xiàn)

數(shù)組模擬循環(huán)隊列

package com.ArrayQueue;

import java.util.Scanner;

public class CircleArrayQueueDemo {
    public static void main(String args[]){
        int maxSize = 4;
        CircleArrayQueue queue = new CircleArrayQueue(maxSize);
        Scanner scanner = new Scanner(System.in);
        char key;
        boolean loop = true;
        while (loop) {
            //根據(jù)輸入的不同字母,進行對應的操作
            System.out.println("a(add):添加一個數(shù)據(jù)");
            System.out.println("g(get):取出一個數(shù)據(jù)");
            System.out.println("h(head):展示頭部數(shù)據(jù)");
            System.out.println("s(show):展示所有數(shù)據(jù)");
            System.out.println("q(quit):退出程序");
            //因為判滿條件的緣故,隊列的最大容量實為maxSize-1
            System.out.printf("(隊列的最大容量為:%d)\n",maxSize-1);
            key = scanner.next().charAt(0);//接收一個字符
            try {
                switch (key) {
                    case 'a':
                        System.out.println("請輸入一個數(shù):");
                        int value = scanner.nextInt();
                        queue.addQueue(value);
                        System.out.println("數(shù)據(jù)添加成功。");
                        break;
                    case 'g':
                        System.out.printf("取出的數(shù)據(jù)為:%d\n", queue.getQueue());
                        break;
                    case 'h':
                        queue.headQueue();
                        break;
                    case 's':
                        queue.showQueue();
                        break;
                    case 'q':
                        scanner.close();
                        loop = false;
                        System.out.println("程序已退出。");
                        break;
                    default:
                        break;
                }
            } catch (RuntimeException e) {
                System.out.println(e.getMessage());
            }
        }
    }
}
/**
 * 隊列的順序表示
 * 數(shù)組模擬循環(huán)隊列
 */
class CircleArrayQueue{
    private int maxSize;
    private int front;//指向頭元素所在位置
    private int rear;//指向尾元素所在位置的下一個位置
    private int arr[];//存放數(shù)據(jù)的數(shù)組

    //構造器,傳入數(shù)組最大容量值
    public CircleArrayQueue(int size){
        maxSize = size;
        front = 0;
        rear = 0;
        //雖然數(shù)組最大容量為maxSize,但實際用于存儲的只有maxSize-1
        arr = new int[maxSize];
    }
    //判空條件:front == rear
    public boolean isEmpty(){
        return front == rear;
    }
    //判滿條件:(rear+1)%maxSize == front
    public boolean isFull(){
        return (rear+1)%maxSize == front;
    }
    //添加數(shù)據(jù),入隊
    public void addQueue(int n){
        //判滿
        checkFull();
        arr[rear] = n;
        rear = (rear+1)%maxSize;
    }
    //取出數(shù)據(jù),出隊
    public int getQueue(){
        //判空
        checkEmpty();
        int value = arr[front];
        front = (front+1)%maxSize;
        return value;
    }
    //隊列中的有效值個數(shù)
    public int size(){
        return (rear-front+maxSize)%maxSize;
    }
    //展示隊列的所有數(shù)據(jù)
    public void showQueue(){
        //判空
        checkEmpty();
        for(int i=front;i<front+size();i++){
            System.out.printf("arr[%d]=%d\n",i%maxSize,arr[i%maxSize]);
        }
        System.out.printf("當前front=%d,rear=%d\n",front,rear);
    }
    //展示位于隊列頭部的元素值,不改變front的指向
    public void headQueue(){
        //判空
        checkEmpty();
        System.out.printf("頭部數(shù)據(jù)是:%d\n",arr[front]);
    }
    //檢測出隊列為空時,打印當前front,rear的值,拋出異常
    public void checkEmpty(){
        if (isEmpty()) {
            System.out.printf("當前front=%d,rear=%d\n",front,rear);
            throw new RuntimeException("隊列為空,不能取數(shù)據(jù)");
        }
    }
    //檢測出隊列滿時,打印當前front,rear的值,拋出異常
    public void checkFull(){
        if(isFull()){
            System.out.printf("當前front=%d,rear=%d\n",front,rear);
            throw new RuntimeException("隊列已滿,不能添加數(shù)據(jù)");
        }
    }
}

五、運行結果


在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

到此這篇關于Java基礎之數(shù)組模擬循環(huán)隊列的文章就介紹到這了,更多相關Java數(shù)組模擬循環(huán)隊列內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一篇文章帶你入門Java?UML的類圖

    一篇文章帶你入門Java?UML的類圖

    這篇文章主要為大家詳細介紹了Java?UML的類圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Java多線程之循環(huán)柵欄技術CyclicBarrier使用探索

    Java多線程之循環(huán)柵欄技術CyclicBarrier使用探索

    這篇文章主要介紹了Java多線程之循環(huán)柵欄技術CyclicBarrier,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>
    2024-01-01
  • mybatis中如何傳遞單個String類型的參數(shù)

    mybatis中如何傳遞單個String類型的參數(shù)

    這篇文章主要介紹了mybatis中如何傳遞單個String類型的參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java如何連接數(shù)據(jù)庫圖文教程

    Java如何連接數(shù)據(jù)庫圖文教程

    關于java數(shù)據(jù)庫的文章早已是非常多了,本文是對我個人過往學習java數(shù)據(jù)庫,理解及應用java數(shù)據(jù)庫的一個總結,下面這篇文章主要給大家介紹了關于Java如何連接數(shù)據(jù)庫的相關資料,需要的朋友可以參考下
    2023-04-04
  • SpringCloud容器化服務發(fā)現(xiàn)及注冊實現(xiàn)方法解析

    SpringCloud容器化服務發(fā)現(xiàn)及注冊實現(xiàn)方法解析

    這篇文章主要介紹了SpringCloud容器化服務發(fā)現(xiàn)及注冊實現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Java方法的覆蓋與隱藏的區(qū)別分析

    Java方法的覆蓋與隱藏的區(qū)別分析

    本篇文章介紹了,關于Java方法的覆蓋與隱藏的區(qū)別分析。需要的朋友參考下
    2013-04-04
  • ThreadLocal?在上下文傳值場景實踐源碼

    ThreadLocal?在上下文傳值場景實踐源碼

    這篇文章主要為大家介紹了ThreadLocal在上下文傳值場景下的實踐源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • Java代碼審計之URL重定向的問題解決

    Java代碼審計之URL重定向的問題解決

    URLRedirect url重定向漏洞也稱url任意跳轉漏洞,網(wǎng)站信任了用戶的輸入導致惡意攻擊,本文主要介紹了Java代碼審計之URL重定向的問題解決,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • Java計算幾何圖形面積的實例代碼

    Java計算幾何圖形面積的實例代碼

    這篇文章主要介紹了Java計算幾何圖形面積的實例代碼,需要的朋友可以參考下
    2014-03-03
  • 淺談JAVA內存分配與參數(shù)傳遞

    淺談JAVA內存分配與參數(shù)傳遞

    這篇文章主要介紹了JAVA內存分配與參數(shù)傳遞,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03

最新評論