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

Java隊(duì)列篇之實(shí)現(xiàn)數(shù)組模擬隊(duì)列及可復(fù)用環(huán)形隊(duì)列詳解

 更新時(shí)間:2021年10月13日 10:16:04   作者:葉綠體不忘呼吸  
像棧一樣,隊(duì)列(queue)也是一種線性表,它的特性是先進(jìn)先出,插入在一端,刪除在另一端。就像排隊(duì)一樣,剛來的人入隊(duì)(push)要排在隊(duì)尾(rear),每次出隊(duì)(pop)的都是隊(duì)首(front)的人

隊(duì)列簡(jiǎn)介

隊(duì)列是一個(gè)有序列表,可以用數(shù)組或是鏈表來實(shí)現(xiàn)。

遵循先入先出的原則。即先存入隊(duì)列的數(shù)據(jù),先取出,后存入的后取出。

示意圖:(使用數(shù)組模擬隊(duì)列示意圖)

在這里插入圖片描述


有兩個(gè)分別指向頭部和尾部的“指針”。

數(shù)組模擬隊(duì)列(無法復(fù)用)

1、實(shí)現(xiàn)思路

隊(duì)列本身是有序列表,若使用數(shù)組的結(jié)構(gòu)來存儲(chǔ)隊(duì)列的數(shù)據(jù),則隊(duì)列數(shù)組的聲明如下圖,其中maxSize是該隊(duì)列的最大容量。

因?yàn)殛?duì)列的輸出、輸入是分別從前后端來處理,因此需要兩個(gè)變量front及rear分別記錄隊(duì)列前后端的下標(biāo),front會(huì)隨著數(shù)據(jù)輸出而改變,而rear則是隨著數(shù)據(jù)輸入而改變,如圖所示:

在這里插入圖片描述

當(dāng)我們將數(shù)據(jù)存入隊(duì)列時(shí)稱為addQueue,addQueue的處理需要有兩個(gè)步驟:
①將尾指針往后移。
②若尾指針rear小于隊(duì)列的最大下標(biāo)maxSize-1,則將數(shù)據(jù)存入rear 所指的數(shù)組元素中,否則無法存入數(shù)據(jù)。

rear+1當(dāng)front== rear[空]
rear==maxSize-1[隊(duì)列滿]

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

①數(shù)組實(shí)現(xiàn)隊(duì)列類

class ArrQueue {
    private int maxSize; //隊(duì)列(數(shù)組)最大容量
    private int front; //指向隊(duì)列頭部
    private int rear; //指向隊(duì)列尾部
    private int[] queue;

    //創(chuàng)造隊(duì)列的構(gòu)造器
    public ArrQueue(int maxSize){
        this.maxSize = maxSize;
        queue = new int[maxSize];
        front = -1; //其實(shí)是隊(duì)列第一個(gè)元素的前一個(gè)索引
        rear = -1; //最后一個(gè)元素的索引
    }

    //判斷是否滿
    public boolean isFull(){
        return rear == maxSize - 1;
    }

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

    //添加元素
    public void addQueue(int n){
        if (isFull()){
            System.out.println("隊(duì)列已經(jīng)滿了,無法添加!");
            return;
        }else {
            rear++;
            queue[rear] = n;
        }

    }

    //取出元素
    public int getQueue(){
        if (isEmpty()){
            throw new RuntimeException("隊(duì)列為空,無元素可??!");
        }else {
            front++;
            return queue[front];
        }
    }

    //顯示隊(duì)列
    public void showQueue(){
        if (isEmpty()){
            System.out.println("隊(duì)列為空,沒有元素可顯示!");
            return;
        }
        for (int i : queue){
            System.out.println(i);
        }
    }

    //顯示頭數(shù)據(jù)
    public void headQueue(){
        if (isEmpty()){
            throw new RuntimeException("隊(duì)列為空,沒有頭數(shù)據(jù)!");
        }
        int i = front;
        System.out.println(queue[++i]);
    }

}

②測(cè)試類

import java.util.Scanner;

/**
 * @Author: Yeman
 * @Date: 2021-10-11-22:02
 * @Description:
 */
public class ArrayQueueTest {
    public static void main(String[] args) {
        //創(chuàng)建一個(gè)隊(duì)列
        ArrQueue arrQueue = new ArrQueue(3);
        //創(chuàng)建一個(gè)用戶輸入
        Scanner scanner = new Scanner(System.in);
        //創(chuàng)建一個(gè)功能菜單
        char key = ' ';
        boolean isShow = true;
        while (isShow){
            System.out.println("s:顯示隊(duì)列");
            System.out.println("a:添加數(shù)據(jù)");
            System.out.println("g:取出數(shù)據(jù)");
            System.out.println("h:顯示頭數(shù)據(jù)");
            System.out.println("e:退出程序");
            key = scanner.next().charAt(0);
            switch (key){
                case 's' :
                    arrQueue.showQueue();
                    break;
                case 'a' :
                    System.out.println("請(qǐng)輸入一個(gè)數(shù):");
                    int value = scanner.nextInt();
                    arrQueue.addQueue(value);
                    break;
                case 'g' :
                    try {
                        System.out.println(arrQueue.getQueue());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                case 'h' :
                    try {
                        arrQueue.headQueue();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                case 'e' :
                    isShow = false;
                    break;
            }
        }
        System.out.println("程序退出...");
    }
}

數(shù)組模擬環(huán)形隊(duì)列(可復(fù)用)

對(duì)前面的數(shù)組模擬隊(duì)列的優(yōu)化,充分利用數(shù)組。將數(shù)組看做是一個(gè)環(huán)形的,即取出之后,有位置可以空出來添加。(通過取模的方式來實(shí)現(xiàn)即可)

分析說明:
①尾索引的下一個(gè)為頭索引時(shí)表示隊(duì)列滿,即將隊(duì)列容量空出一個(gè)作為約定。在作判斷隊(duì)列滿的時(shí)候需要注意(rear+ 1) % maxSize== front [滿]
②rear == front [空]

1、思路如下:

①front 變量的含義調(diào)整:front 指向隊(duì)列的第一個(gè)元素, 也就是說arr[front]就是隊(duì)列的第一個(gè)元素,front的初始值為0。
②rear 變量的含義調(diào)整:rear 指向隊(duì)列的最后一個(gè)元素的后一個(gè)位置,因?yàn)橄M粘鲆粋€(gè)空間做為約定,rear的初始值=0。
③當(dāng)隊(duì)列滿時(shí),條件是(rear + 1) % maxSize == front [滿]
④對(duì)隊(duì)列為空的條件是rear== front[空]
⑤當(dāng)我們這樣分析,隊(duì)列中有效的數(shù)據(jù)的個(gè)數(shù)(rear + maxSize - front) % maxSize
⑥我們就可以在原來的隊(duì)列上修改得到一個(gè)環(huán)形隊(duì)列

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

①數(shù)組實(shí)現(xiàn)環(huán)形隊(duì)列類

class ArrQueue {
    private int maxSize; //隊(duì)列(數(shù)組)最大容量
    private int front; //指向隊(duì)列頭部,隊(duì)列第一個(gè)元素的索引
    private int rear; //指向隊(duì)列尾部,隊(duì)列最后一個(gè)元素的后一個(gè)索引
    private int[] queue;

    //創(chuàng)造隊(duì)列的構(gòu)造器
    public ArrQueue(int maxSize){
        this.maxSize = maxSize;
        queue = new int[maxSize];
    }

    //判斷是否滿
    public boolean isFull(){
        return (rear + 1) % maxSize == front;
    }

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

    //添加元素
    public void addQueue(int n){
        if (isFull()){
            System.out.println("隊(duì)列已經(jīng)滿了,無法添加!");
            return;
        }else {
            queue[rear] = n;
            rear = (rear + 1) % maxSize;
        }

    }

    //取出元素
    public int getQueue(){
        if (isEmpty()){
            throw new RuntimeException("隊(duì)列為空,無元素可??!");
        }else {
            int data = queue[front];
            front = (front + 1) % maxSize;
            return data;
        }
    }

    //顯示隊(duì)列
    public void showQueue(){
        if (isEmpty()){
            System.out.println("隊(duì)列為空,沒有元素可顯示!");
            return;
        }
        for (int i = front; i < front + size(); i++) {
            System.out.printf("arr[%d] = %d\n",i % maxSize,queue[i % maxSize]);
        }

    }
    //求當(dāng)前隊(duì)列有效數(shù)據(jù)個(gè)數(shù)
    public int size(){
        return (rear + maxSize - front) % maxSize;
    }

    //顯示頭數(shù)據(jù)
    public void headQueue(){
        if (isEmpty()){
            throw new RuntimeException("隊(duì)列為空,沒有頭數(shù)據(jù)!");
        }
        System.out.println(queue[front]);
    }
    
}

②測(cè)試類

import java.util.Scanner;

/**
 * @Author: Yeman
 * @Date: 2021-10-11-22:02
 * @Description:
 */
public class ArrayQueueTest {
    public static void main(String[] args) {
        //創(chuàng)建一個(gè)隊(duì)列
        ArrQueue arrQueue = new ArrQueue(3); //說明該環(huán)形隊(duì)列的最大有效數(shù)據(jù)為2
        //創(chuàng)建一個(gè)用戶輸入
        Scanner scanner = new Scanner(System.in);
        //創(chuàng)建一個(gè)功能菜單
        char key = ' ';
        boolean isShow = true;
        while (isShow){
            System.out.println("s:顯示隊(duì)列");
            System.out.println("a:添加數(shù)據(jù)");
            System.out.println("g:取出數(shù)據(jù)");
            System.out.println("h:顯示頭數(shù)據(jù)");
            System.out.println("e:退出程序");
            key = scanner.next().charAt(0);
            switch (key){
                case 's' :
                    arrQueue.showQueue();
                    break;
                case 'a' :
                    System.out.println("請(qǐng)輸入一個(gè)數(shù):");
                    int value = scanner.nextInt();
                    arrQueue.addQueue(value);
                    break;
                case 'g' :
                    try {
                        System.out.println(arrQueue.getQueue());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                case 'h' :
                    try {
                        arrQueue.headQueue();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                case 'e' :
                    isShow = false;
                    break;
            }
        }
        System.out.println("程序退出...");
    }
}

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

相關(guān)文章

  • Spring如何更簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象

    Spring如何更簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象

    這篇文章主要給大家介紹了關(guān)于Spring如何更簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象的相關(guān)資料,在Spring 中想要更簡(jiǎn)單的存儲(chǔ)和讀取對(duì)象的核?是使?注解,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Java?設(shè)計(jì)模式中的策略模式詳情

    Java?設(shè)計(jì)模式中的策略模式詳情

    這篇文章主要介紹了Java?設(shè)計(jì)模式中的策略模式詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Spring Boot 2.7.6整合redis與低版本的區(qū)別

    Spring Boot 2.7.6整合redis與低版本的區(qū)別

    這篇文章主要介紹了Spring Boot 2.7.6整合redis與低版本的區(qū)別,文中補(bǔ)充介紹了SpringBoot各個(gè)版本使用Redis之間的區(qū)別實(shí)例講解,需要的朋友可以參考下
    2023-02-02
  • Mybatis實(shí)現(xiàn)自動(dòng)生成增刪改查代碼

    Mybatis實(shí)現(xiàn)自動(dòng)生成增刪改查代碼

    這篇文章主要為大家詳細(xì)介紹了Mybatis如何實(shí)現(xiàn)自動(dòng)生成增刪改查代碼的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-01-01
  • 如何解決java獲取時(shí)間相差8小時(shí)的問題

    如何解決java獲取時(shí)間相差8小時(shí)的問題

    最近使用new date()獲取的時(shí)間會(huì)和真實(shí)的本地時(shí)間相差8小時(shí)。本文就詳細(xì)的來介紹一下解決java獲取時(shí)間相差8小時(shí)的問題,感興趣的可以了解一下
    2021-09-09
  • SpringBoot接口惡意刷新和暴力請(qǐng)求的解決方法

    SpringBoot接口惡意刷新和暴力請(qǐng)求的解決方法

    在實(shí)際項(xiàng)目使用中,必須要考慮服務(wù)的安全性,當(dāng)服務(wù)部署到互聯(lián)網(wǎng)以后,就要考慮服務(wù)被惡意請(qǐng)求和暴力攻擊的情況,所以本文給大家介紹了SpringBoot接口惡意刷新和暴力請(qǐng)求的解決方法,需要的朋友可以參考下
    2024-11-11
  • 解決IDEA中Maven依賴包導(dǎo)入失敗報(bào)紅問題(總結(jié)最有效8種解決方案)

    解決IDEA中Maven依賴包導(dǎo)入失敗報(bào)紅問題(總結(jié)最有效8種解決方案)

    這篇文章主要介紹了解決IDEA中Maven依賴包導(dǎo)入失敗報(bào)紅問題,本文通過圖文詳解給大家總結(jié)了最有效的8種解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java深入解析接口interface

    Java深入解析接口interface

    接口是Java中最重要的概念之一,它可以被理解為一種特殊的類,不同的是接口的成員沒有執(zhí)行體,是由全局常量和公共的抽象方法所組成,本文給大家介紹Java接口,感興趣的朋友一起看看吧
    2022-06-06
  • Java使用Hutool實(shí)現(xiàn)AES、DES加密解密的方法

    Java使用Hutool實(shí)現(xiàn)AES、DES加密解密的方法

    本篇文章主要介紹了Java使用Hutool實(shí)現(xiàn)AES、DES加密解密的方法,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • Spring-boot原理及spring-boot-starter實(shí)例和代碼

    Spring-boot原理及spring-boot-starter實(shí)例和代碼

    spring-boot的starter是一個(gè)通過maven完成自包含并通過annotation配置使得可被spring上下文發(fā)現(xiàn)并實(shí)例化的一個(gè)可插拔的組件或服務(wù)。這篇文章主要介紹了Spring-boot原理及spring-boot-starter實(shí)例和代碼 ,需要的朋友可以參考下
    2019-06-06

最新評(píng)論

临泉县| 凤凰县| 博爱县| 中山市| 廊坊市| 深水埗区| 乐至县| 聂荣县| 图片| 裕民县| 环江| 临邑县| 巍山| 佛冈县| 青龙| 湟中县| 天门市| 南澳县| 福安市| 万载县| 治多县| 六盘水市| 大城县| 崇州市| 涿鹿县| 蓬莱市| 常德市| 庄河市| 新建县| 海城市| 枣强县| 故城县| 丰顺县| 正镶白旗| 黔南| 讷河市| 定结县| 盐亭县| 太保市| 灵石县| 永丰县|