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

Java隊(duì)列數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)

 更新時(shí)間:2022年01月24日 17:30:12   作者:HairLossException  
這篇文章主要介紹了Java隊(duì)列數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn),隊(duì)列是一種特殊的線性表,只允許在表的隊(duì)頭進(jìn)行刪除操作,在表的后端進(jìn)行插入操作,隊(duì)列是一個(gè)有序表先進(jìn)先出,想了解更多相關(guān)資料的小伙伴可以參考下面文章的詳細(xì)內(nèi)容

1.隊(duì)列的基本概念

什么是隊(duì)列?

  • 隊(duì)列是一種特殊的線性表
  • 它只允許在表的前端(隊(duì)頭)進(jìn)行刪除操作
  • 在表的后端(隊(duì)尾)進(jìn)行插入操作
  • 隊(duì)列是一個(gè)有序表(可以用數(shù)組或鏈表實(shí)現(xiàn))
  • 隊(duì)列先進(jìn)先出
  • 隊(duì)列開辟的是一塊連續(xù)的空間

順序隊(duì)列中的溢出現(xiàn)象:

  • 真溢出:當(dāng)隊(duì)列滿時(shí),做進(jìn)棧運(yùn)算產(chǎn)生空間溢出的現(xiàn)象。
  • 假上溢:由于入隊(duì)和出隊(duì)操作中,頭尾指針只增加不減小,致使被刪元素的空間永遠(yuǎn)無法重新利用。當(dāng)隊(duì)列中實(shí)際的元素個(gè)數(shù)遠(yuǎn)遠(yuǎn)小于向量空間的規(guī)模時(shí),也可能由于尾指針已超越向量空間的上界而不能做入隊(duì)操作。

2.循環(huán)隊(duì)列

在實(shí)際使用隊(duì)列時(shí),為了使隊(duì)列空間能重復(fù)使用,往往對隊(duì)列的使用方法稍加改進(jìn):無論插入或刪除,一旦rear指針增1或front指針增1 時(shí)超出了所分配的隊(duì)列空間,就讓它指向這片連續(xù)空間的起始位置。自己真從MaxSize-1增1變到0,可用取余運(yùn)算rear%MaxSizefront%MaxSize來實(shí)現(xiàn)。這實(shí)際上是把隊(duì)列空間想象成一個(gè)環(huán)形空間,環(huán)形空間中的存儲單元循環(huán)使用,用這種方法管理的隊(duì)列也就稱為循環(huán)隊(duì)列。除了一些簡單應(yīng)用之外,真正實(shí)用的隊(duì)列是循環(huán)隊(duì)列

3.實(shí)現(xiàn)思路

由于普通隊(duì)列存在溢出問題所以這里用數(shù)組來實(shí)現(xiàn)環(huán)形隊(duì)列

  • 1、front指向隊(duì)列的首元素 初始為0
  • 2、rear指向隊(duì)列尾元素的后一個(gè)位置 (空出來的一塊空間作為約定)初始為0
  • 3、隊(duì)列滿的條件:(rear+1) % maxSize = front
  • 4、隊(duì)列空的條件:rear = front
  • 5、隊(duì)列中元素的個(gè)數(shù):(rear+maxSize-front) % maxSize

為什么隊(duì)列滿的條件是(rear+1) % maxSize = front

(1)假設(shè)rear>front
rear-front=maxSize-1
rear+1-maxSize=front

由于當(dāng)rear>front隊(duì)列滿時(shí)rear+1一定等于maxSize
(rear+1) % maxSize = rear+1-maxSize =0

(2)假設(shè)front>rear
front-rear=1
rear+1=front

由于當(dāng)front>rear時(shí)rear+1一定小于maxSize
所以(rear+1) % maxSize=rear+1
(3)有上述所示可以得出隊(duì)列滿的條件是(rear+1) % maxSize = front
元素個(gè)數(shù)的計(jì)數(shù)與這相似

4.代碼實(shí)現(xiàn)

public class Queue {
    private int maxSzie; //隊(duì)列中能存儲的最大個(gè)數(shù)
    private int frontPoint; //頭指針指向隊(duì)頭
    private int rearPoint; //尾指針指向隊(duì)尾的后一個(gè)數(shù)據(jù)
    private int[] array; //模擬隊(duì)列的數(shù)組

    /**
     * 初始化隊(duì)列
     */
    public Queue(int max) {
        maxSzie = max;
        frontPoint = 0;
        rearPoint = 0;
        array = new int[max];
    }

    /**
     * 判斷隊(duì)列是否為空
     */
    public boolean isEmpty(){
        return frontPoint == rearPoint;
    }
    /**
     * 判斷隊(duì)列是否已滿
     */
    public boolean isFull(){
        return (rearPoint+1)%maxSzie == frontPoint;
    }
    /**
     * 向隊(duì)列中添加數(shù)據(jù)
     */
    public void add(int x){
        if (isFull()){
            System.out.println("當(dāng)前隊(duì)列已滿");
            return;
        }
        //添加數(shù)據(jù)
        array[rearPoint] = x ;
        //后移尾指針
        rearPoint = (rearPoint+1) % maxSzie;
        System.out.println("添加成功");
    }
    /**
     * 取出隊(duì)列中的數(shù)據(jù)
     */
    public int remove(){
        if (isEmpty()){
            throw new RuntimeException("當(dāng)前隊(duì)列為空");
        }
        //把隊(duì)頭的值賦值給臨時(shí)變量
        int x = array[frontPoint];
        //移除數(shù)據(jù)后頭指針需要向后移動 時(shí)其指向新的隊(duì)頭
        frontPoint = (frontPoint+1) % maxSzie;
        System.out.println("移除成功");
        return x;
    }
    /**
     * 獲取隊(duì)列頭數(shù)據(jù)
     */
    public int gethead(){
        if (isEmpty()){
            throw new RuntimeException("當(dāng)前隊(duì)列為空");
        }
        return array[frontPoint];
    }
    /**
     * 遍歷隊(duì)列
     */
    public void show(){
        int x = 0;
       for (int i = frontPoint; i <= (rearPoint+maxSzie-frontPoint)%maxSzie; i++) {
            x++;
            System.out.println("隊(duì)列的第"+x+"個(gè)數(shù)據(jù)是"+array[i]);
        }
    }
}

public class QueueTest {
    public static void main(String[] args) {
        Queue queue = new Queue(5);
        Scanner scanner = new Scanner(System.in);
        char systemIn = ' ';
        boolean noEnd = true;
        while (noEnd){
            System.out.println("a:add(添加數(shù)據(jù))");
            System.out.println("r:remove(刪除數(shù)據(jù))");
            System.out.println("h:head(獲取隊(duì)頭)");
            System.out.println("s:show(遍歷隊(duì)列)");
            System.out.println("e:exit(退出程序)");
            System.out.println("請輸入字符");
            systemIn = scanner.next().charAt(0);
            switch (systemIn){
                case 'a':
                    System.out.println("請輸入入隊(duì)的數(shù)據(jù)(數(shù)字)");
                    int x = Integer.parseInt(scanner.next());
                    queue.add(x);
                    break;
                case 'r':
                    queue.remove();
                    break;
                case 'h':
                    int head = queue.gethead();
                    System.out.println("隊(duì)頭是"+head);
                    break;
                case 's':
                    queue.show();
                    break;
                case 'e':
                    noEnd = false;
                    break;
            }
        }
    }
}

5.測試

到此這篇關(guān)于Java隊(duì)列數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java隊(duì)列數(shù)據(jù)結(jié)構(gòu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)文件保存到本地的方法

    java實(shí)現(xiàn)文件保存到本地的方法

    本篇文章主要介紹了java實(shí)現(xiàn)文件保存到本地的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • JVM內(nèi)存參數(shù)配置詳解

    JVM內(nèi)存參數(shù)配置詳解

    本文主要介紹了JVM內(nèi)存參數(shù)配置詳解,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java設(shè)計(jì)模式七大原則之單一職責(zé)原則詳解

    Java設(shè)計(jì)模式七大原則之單一職責(zé)原則詳解

    單一職責(zé)原則(Single Responsibility Principle, SRP),有且僅有一個(gè)原因引起類的變更。簡單來說,就是針對一個(gè)java類,它應(yīng)該只負(fù)責(zé)一項(xiàng)職責(zé)。本文將詳細(xì)介紹一下Java設(shè)計(jì)模式七大原則之一的單一職責(zé)原則,需要的可以參考一下
    2022-02-02
  • SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時(shí)丟失精度問題

    SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時(shí)丟失精度問題

    這篇文章主要介紹了SpringBoot2.0解決Long型數(shù)據(jù)轉(zhuǎn)換成json格式時(shí)丟失精度問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java instanceof用法詳解及實(shí)例代碼

    Java instanceof用法詳解及實(shí)例代碼

    這篇文章主要介紹了Java instanceof用法詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • java父子節(jié)點(diǎn)parentid樹形結(jié)構(gòu)數(shù)據(jù)的規(guī)整

    java父子節(jié)點(diǎn)parentid樹形結(jié)構(gòu)數(shù)據(jù)的規(guī)整

    這篇文章主要介紹了java父子節(jié)點(diǎn)parentid樹形結(jié)構(gòu)數(shù)據(jù)的規(guī)整,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java 基本算法之歸并排序?qū)嵗a

    java 基本算法之歸并排序?qū)嵗a

    這篇文章主要介紹了java 基本算法之歸并排序?qū)嵗a的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • SpringBoot中實(shí)現(xiàn)Redis緩存預(yù)熱

    SpringBoot中實(shí)現(xiàn)Redis緩存預(yù)熱

    緩存預(yù)熱是一種在系統(tǒng)啟動后,但在實(shí)際使用前將數(shù)據(jù)加載到緩存中的技術(shù),本文主要來和大家一起探討如何在Spring Boot應(yīng)用程序中實(shí)現(xiàn)Redis緩存預(yù)熱,以確保系統(tǒng)在處理請求前就已經(jīng)處于最佳狀態(tài),感興趣的可以了解下
    2023-11-11
  • java web FTPClient實(shí)現(xiàn)上傳文件到指定服務(wù)器

    java web FTPClient實(shí)現(xiàn)上傳文件到指定服務(wù)器

    這篇文章主要為大家詳細(xì)介紹了java web FTPClient實(shí)現(xiàn)上傳文件到指定服務(wù)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Java中SimpleDateFormat方法超詳細(xì)分析

    Java中SimpleDateFormat方法超詳細(xì)分析

    這篇文章主要給大家介紹了關(guān)于Java中SimpleDateFormat方法超詳細(xì)分析的相關(guān)資料,SimpleDateFormat 是一個(gè)以國別敏感的方式格式化和分析數(shù)據(jù)的具體類,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08

最新評論

北京市| 浮梁县| 犍为县| 丹寨县| 鄂温| 观塘区| 宁国市| 大名县| 诸暨市| 军事| 宝丰县| 镇康县| 徐州市| 桃园县| 蓝山县| 莆田市| 滨海县| 靖安县| 米易县| 泽库县| 鄂托克前旗| 九江市| 陵水| 西乌珠穆沁旗| 黄浦区| 高安市| 天祝| 体育| 安塞县| 辽宁省| 万宁市| 治县。| 五大连池市| 苍山县| 鹰潭市| 邵阳市| 高淳县| 双桥区| 太原市| 巴塘县| 扎兰屯市|