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

Java 棧與隊(duì)列超詳細(xì)分析講解

 更新時(shí)間:2022年04月02日 15:24:44   作者:Scintillator. /  
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列,在Java的時(shí)候,對于棧與隊(duì)列的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時(shí)候能夠有扎實(shí)的基礎(chǔ)能力。本文小編就來詳細(xì)說說Java中的棧與隊(duì)列,需要的朋友可以參考一下

一、棧(Stack)

1、什么是棧?

棧其實(shí)就是一種數(shù)據(jù)結(jié)構(gòu) - 先進(jìn)后出(先入棧的數(shù)據(jù)后出來,最先入棧的數(shù)據(jù)會(huì)被壓入棧底)

在這里插入圖片描述

什么是java虛擬機(jī)棧?

java虛擬機(jī)棧只是JVM當(dāng)中的一塊內(nèi)存,該內(nèi)存一般用來存放 例如:局部變量當(dāng)調(diào)用函數(shù)時(shí),我們會(huì)為函數(shù)開辟一塊內(nèi)存,叫做 棧幀,在 java虛擬機(jī)棧中開辟,具體如下。

在這里插入圖片描述

常見考點(diǎn):不可能的出棧順序

在這里插入圖片描述

這道題該怎么分析呢?

首先我們知道,出棧時(shí)拿到的第一個(gè)元素為4,那么4必須入棧,因?yàn)槿霔5捻樞蚴?1 2 3 4 5 6,所以4要入棧,1 2 3 得先入棧。(通過后面分析得知,該出棧序列正確)

在這里插入圖片描述

2、棧的常見方法

方法作用
E push(E item)放入元素
E pop()獲取棧頂元素并彈出
E peek()獲取棧頂元素
boolean isEmpty()判斷棧是否為空(父類Vector的方法)

3、自己實(shí)現(xiàn)一個(gè)棧(底層用一個(gè)數(shù)組實(shí)現(xiàn))

public class MyStack {
    public int[] elem;
    public int usedSize;

    public MyStack() {
        this.elem = new int[4];
    }

    // 放入元素
    public void push(int val) {
        if(isFull()) {
            // 如果放滿了,二倍擴(kuò)容
            this.elem = Arrays.copyOf(elem,2 * elem.length);
        }
        this.elem[this.usedSize++] = val;
    }
    // 獲取棧頂元素并彈出
    public int pop() {
        if (isEmpty()) {
            throw new RuntimeException("棧為空!");
        }
        usedSize--;
        return elem[usedSize];
    }
    // 獲取棧頂元素
    public int peek() {
        if (isEmpty()) {
            throw new RuntimeException("棧為空!");
        }
        return elem[usedSize-1];
    }
    // 是否為空
    public boolean isEmpty() {
        return usedSize == 0;
    }
    // 是否滿了
    public boolean isFull() {
        return elem.length == usedSize;
    }
}

二、隊(duì)列(Queue)

1、什么是隊(duì)列?

只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有 - 先進(jìn)先出。

入隊(duì)列:進(jìn)行插入操作的一端稱為隊(duì)尾

出隊(duì)列:進(jìn)行刪除操作的一端稱為隊(duì)頭

在這里插入圖片描述

在這里插入圖片描述

2、隊(duì)列的常見方法

在這里插入圖片描述

在這里插入圖片描述

// 普通隊(duì)列
Queue<Integer> queue = new LinkedList<>();
queue.offer(1);// 隊(duì)尾入
int top = queue.peek();// 獲取隊(duì)頭元素
queue.poll();// 彈出隊(duì)尾元素并返回

// 雙端隊(duì)列
Deque<Integer> deque = new LinkedList<>();
deque.offer(1);// 默認(rèn)隊(duì)尾入
deque.offerFirst(2);// 隊(duì)頭入
deque.offerLast(3);// 隊(duì)尾入

deque.peekFirst();// 獲取隊(duì)頭元素
deque.peekLast();// 獲取隊(duì)尾元素

deque.pollFirst();// 彈出隊(duì)頭元素并返回
deque.pollLast();// 彈出隊(duì)尾元素并返回

3、隊(duì)列的實(shí)現(xiàn)(單鏈表實(shí)現(xiàn))

在這里插入圖片描述

/**
 * 每個(gè)節(jié)點(diǎn)
 */
class Node{
    public int val;
    public Node next;

    public Node(int val) {
        this.val = val;
    }
}
public class MyQueue {
    public Node head;
    public Node tail;

    /**
     * 插入元素 -- 尾插法
     * @param val
     */
    public void offer(int val) {
        Node node = new Node(val);
        if (head == null) {
            head = node;
            tail = node;
        }else {
            tail.next = node;
            tail = tail.next;
        }
    }

    /**
     * 出隊(duì)列
     */
    public int poll() {
        if(isEmpty()) {
            throw new RuntimeException("隊(duì)列為空!");
        }
        int val = head.val;
        head = head.next;
        return val;
    }

    /**
     * 獲取隊(duì)頭元素
     */
    public int peek() {
        if(isEmpty()) {
            throw new RuntimeException("隊(duì)列為空!");
        }
        return head.val;
    }
    
    // 隊(duì)列是否為空
    public boolean isEmpty() {
        return head == null;
    }
}

4、循環(huán)隊(duì)列

當(dāng)考慮用數(shù)組來實(shí)現(xiàn)一個(gè)隊(duì)列, 很容易想到以下結(jié)構(gòu):

在這里插入圖片描述

當(dāng)我們連續(xù)從該隊(duì)頭中彈出元素時(shí),就可以發(fā)現(xiàn)問題了

在這里插入圖片描述

可以看到此時(shí)數(shù)組并沒有滿,但是當(dāng)我們再次插入元素時(shí),隊(duì)尾卻插入不了了,這時(shí)候我們可以想到將該數(shù)組看成是循環(huán)的數(shù)組,結(jié)構(gòu)如下。

在這里插入圖片描述

可以看出,當(dāng) front 和 rear 相遇時(shí),隊(duì)列可能的情況有兩種,要么為空,要么是滿的狀態(tài)。那么隊(duì)列什么時(shí)候?yàn)榭?,什么時(shí)候是滿的呢?

我們有兩種方法:

1、設(shè)置usedSize 當(dāng)usedSize和數(shù)組長度相等時(shí)為滿,等于0 則為空。

2、設(shè)置標(biāo)志位 設(shè) flag = true,每放一個(gè)元素,將 flag 置為 false,每有一個(gè)元素出隊(duì)列,則將 flag 置為 true。當(dāng) front 和 rear 相遇時(shí),flag為 true 則是空的,反之則是滿的。

public class MyCircularQueue {
    public int[] elem;
    public int front;// 隊(duì)頭下標(biāo)
    public int rear;// 隊(duì)尾下標(biāo)
    boolean flag = true;// 是否為空

    public MyCircularQueue(int k) {
        elem = new int[k];
    }

    // 向循環(huán)隊(duì)列插入一個(gè)元素。如果成功插入則返回真。
    public boolean enQueue(int value) {
        if (isFull()) {
            return false;
//            throw new RuntimeException("隊(duì)列已滿!");
        }
        elem[rear] = value;
        rear = (rear + 1) % elem.length;
        flag = false;
        return true;
    }

    // 從循環(huán)隊(duì)列中刪除一個(gè)元素。如果成功刪除則返回真。
    public boolean deQueue() {
        if (isEmpty()) {
            return false;
//            throw new RuntimeException("隊(duì)列為空!");
        }
        front = (front + 1) % elem.length;
        flag = true;
        return true;
    }

    // 從隊(duì)首獲取元素。如果隊(duì)列為空,返回 -1 。
    public int Front() {
        if (isEmpty()) {
            return -1;
//            throw new RuntimeException("隊(duì)列為空!");
        }
        return elem[front];
    }
    // 獲取隊(duì)尾元素。如果隊(duì)列為空,返回 -1 。
    public int Rear() {
        if (isEmpty()) {
            return -1;
//            throw new RuntimeException("隊(duì)列為空!");
        }
        // 如果是0下標(biāo),拿最后一個(gè)元素
        if (rear == 0) {
            return elem[elem.length-1];
        }else {
            return elem[rear - 1];
        }
    }

    // 檢查循環(huán)隊(duì)列是否為空。
    public boolean isEmpty() {
        if (rear == front && flag){
            return true;
        }
        return false;
    }
    // 檢查循環(huán)隊(duì)列是否已滿。
    public boolean isFull() {
        if (rear == front && !flag){
            return true;
        }
        return false;
    }
}

到此這篇關(guān)于Java 棧與隊(duì)列超詳細(xì)分析講解的文章就介紹到這了,更多相關(guān)Java 棧與隊(duì)列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中ThreadLocal避免內(nèi)存泄漏的方法詳解

    Java中ThreadLocal避免內(nèi)存泄漏的方法詳解

    ThreadLocal是Java中的一個(gè)線程本地存儲(chǔ)機(jī)制,它允許每個(gè)線程擁有一個(gè)獨(dú)立的本地存儲(chǔ)空間,用于存儲(chǔ)該線程的變量,本文主要介紹了ThreadLocal如何避免內(nèi)存泄漏,需要的朋友可以參考下
    2023-05-05
  • 如何使用HttpClient發(fā)送java對象到服務(wù)器

    如何使用HttpClient發(fā)送java對象到服務(wù)器

    這篇文章主要介紹了如何使用HttpClient發(fā)送java對象到服務(wù)器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • java 在圖片上寫字,兩個(gè)圖片合并的實(shí)現(xiàn)方法

    java 在圖片上寫字,兩個(gè)圖片合并的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猨ava 在圖片上寫字,兩個(gè)圖片合并的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • Java lombok中@Accessors注解三個(gè)屬性的作用

    Java lombok中@Accessors注解三個(gè)屬性的作用

    這篇文章主要介紹了Java?lombok的@Accessors注解屬性解析,該注解主要作用是:當(dāng)屬性字段在生成?getter?和?setter?方法時(shí),做一些相關(guān)的設(shè)置,需要的朋友可以參考下
    2023-05-05
  • Java中String的JdbcTemplate連接SQLServer數(shù)據(jù)庫的方法

    Java中String的JdbcTemplate連接SQLServer數(shù)據(jù)庫的方法

    這篇文章主要介紹了Java中String的JdbcTemplate連接SQLServer數(shù)據(jù)庫的方法,在研發(fā)過程中我們需要與其他系統(tǒng)對接的場景,連接SQLServer拉取數(shù)據(jù),所以就用jdbc連接數(shù)據(jù)庫的方式連接外部數(shù)據(jù)源,需要的朋友可以參考下
    2021-10-10
  • MyBatis-Plus更新對象時(shí)將字段值更新為null的四種常見方法

    MyBatis-Plus更新對象時(shí)將字段值更新為null的四種常見方法

    MyBatis-Plus 是一個(gè) MyBatis 的增強(qiáng)工具,在簡化開發(fā)、提高效率方面表現(xiàn)非常出色,而,在使用 MyBatis-Plus 更新對象時(shí),默認(rèn)情況下是不會(huì)將字段值更新為 null 的,如果你需要將某些字段的值更新為 null,有幾種方法可以實(shí)現(xiàn),本文將介紹幾種常見的方法
    2024-11-11
  • Linux環(huán)境下的Java(JDBC)連接openGauss數(shù)據(jù)庫實(shí)踐記錄

    Linux環(huán)境下的Java(JDBC)連接openGauss數(shù)據(jù)庫實(shí)踐記錄

    這篇文章主要介紹了Linux環(huán)境下的Java(JDBC)連接openGauss數(shù)據(jù)庫實(shí)踐記錄,需要的朋友可以參考下
    2022-11-11
  • Java編程讀寫鎖詳解

    Java編程讀寫鎖詳解

    本篇文章給大家詳細(xì)分享了Java編程讀寫鎖的相關(guān)原理以及知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以參考下。
    2018-08-08
  • Intellij idea 代碼提示忽略字母大小寫和常用快捷鍵及設(shè)置步驟

    Intellij idea 代碼提示忽略字母大小寫和常用快捷鍵及設(shè)置步驟

    這篇文章主要介紹了Intellij idea 代碼提示忽略字母大小寫和常用快捷鍵及設(shè)置步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • JAVA List和Map切割工具詳解

    JAVA List和Map切割工具詳解

    這篇文章主要介紹了JAVA List和Map切割工具詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評(píng)論

九江市| 谷城县| 广安市| 柳河县| 雷山县| 佛坪县| 富平县| 县级市| 城固县| 崇仁县| 南涧| 临沧市| 安义县| 柞水县| 衡南县| 永清县| 宁德市| 江津市| 皋兰县| 桓仁| 雷州市| 延川县| 尼勒克县| 敦化市| 保靖县| 祁东县| 五河县| 松阳县| 微山县| 密山市| 家居| 西安市| 蕉岭县| 龙南县| 望江县| 交城县| 阿坝县| 奉节县| 临朐县| 鄂托克前旗| 资兴市|