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

Java 棧和隊(duì)列的相互轉(zhuǎn)換詳解

 更新時(shí)間:2022年02月14日 11:43:47   作者:Word碼鴨  
棧和隊(duì)列,嚴(yán)格意義上來(lái)說(shuō),也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為 "一對(duì)一" 的數(shù)據(jù),但由于它們比較特殊,因此將其單獨(dú)作為一章,做重點(diǎn)講解

棧和隊(duì)列的本質(zhì)是相同的,都只能在線性表的一端進(jìn)行插入和刪除。因此,棧和隊(duì)列可以相互轉(zhuǎn)換。

用棧實(shí)現(xiàn)隊(duì)列—力扣232題

題目要求:僅使用兩個(gè)棧實(shí)現(xiàn)先入先出隊(duì)列。隊(duì)列應(yīng)當(dāng)支持一般隊(duì)列支持的所有操作

使用雙棧來(lái)實(shí)現(xiàn)隊(duì)列,我們就可以讓一個(gè)棧儲(chǔ)存具體元素,另一個(gè)棧做輔助?

上圖可以看到,新元素進(jìn)棧時(shí),要確保該棧為空。進(jìn)入棧的元素按順序存到輔助棧中,等新元素進(jìn)入棧之后,再將輔助棧中的元素按順序出到該棧中。這樣操作之后,棧中元素存放的順序就和隊(duì)列的一樣啦

代碼實(shí)現(xiàn):

 
//雙棧模擬隊(duì)列
public class MyQueue{
    //實(shí)際存儲(chǔ)元素的棧
    private Stack<Integer> s1 = new Stack<>();
    //輔助棧
    private Stack<Integer> s2 = new Stack<>();
 
    public MyQueue() {
 
    }
 
    //將元素 x 推到隊(duì)列的末尾
    public void push(int x) {
        if (s1.empty()){//棧為空,直接放入x
            s1.push(x);
        }else {
            //此時(shí)不為空
            //先把s1所有元素彈出放入s2
            while (!s1.empty()){
                s2.push(s1.pop());//s2放入的值就是s2彈出的值
                //以下兩句和上一句相同
//                int val = s1.pop();
//                s2.push(val);
            }
            //將新元素直接放入s1,此時(shí)新元素就處在s1的棧頂
            s1.push(x);
            //再次將s2的所有值依次彈出放入s1
            while (!s2.empty()){
                s1.push(s2.pop());
            }
        }
 
    }
 
    //從隊(duì)列的開(kāi)頭移除并返回元素
    public int pop() {
       return s1.pop();
    }
 
    //返回隊(duì)列開(kāi)頭的元素
    public int peek() {
        return s1.peek();
    }
 
    //判斷隊(duì)列是否為空
    public boolean empty() {
        return s1.empty();
    }
}

用隊(duì)列實(shí)現(xiàn)?!?25題?

題目要求:僅使用兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè)后入先出(LIFO)的棧,并支持普通棧的全部四種操作

1. 雙隊(duì)列實(shí)現(xiàn)棧

使用雙隊(duì)列實(shí)現(xiàn)棧, q1是存儲(chǔ)元素的隊(duì)列,保證q2添加元素之后永遠(yuǎn)為空隊(duì)列(新元素直接入q2),保證新元素處在隊(duì)首。這樣的話,新元素入隊(duì)之后,另外一個(gè)隊(duì)列的元素依次出隊(duì)然后入隊(duì),這樣就實(shí)現(xiàn)了一個(gè)棧。

代碼實(shí)現(xiàn):

public class MyStack {
    //q1是存儲(chǔ)元素的隊(duì)列
    private Queue<Integer> q1 = new LinkedList<>();
    //q2是輔助隊(duì)列
    //添加元素后保證q2永遠(yuǎn)為空
    private Queue<Integer> q2 = new LinkedList<>();
    public MyStack () {
 
    }
 
    //將元素 x 壓入棧頂
    public void push(int x) {
        //新入隊(duì)元素直接入q2,成為q2隊(duì)首
        q2.offer(x);
        //將q1中的所有元素依次出隊(duì),入q2
        while (!q1.isEmpty()){
            q2.offer(q1.poll());
        }
 
        //q1為空,q2為存儲(chǔ)元素的隊(duì)列,互換引用指向
        //互換之后,q1任然是存儲(chǔ)元素的隊(duì)列,q2為空
        Queue<Integer> temp = q1;
        q1 = q2;
        q2 = temp;
    }
 
    // 移除并返回棧頂元素
    public int pop() {
        return q1.poll();
    }
 
    //返回棧頂元素
    public int top() {
        return q1.peek();
    }
 
    //判斷棧是否為空
    public boolean empty() {
        return q1.isEmpty();
    }
}
 

2.一個(gè)隊(duì)列實(shí)現(xiàn)棧

先將元素入隊(duì),再將之前的元素依次出隊(duì)再入隊(duì)即可!也就是說(shuō),保證新元素在隊(duì)首

代碼實(shí)現(xiàn):

public class MyStack {
    private Queue<Integer> queue = new LinkedList<>();
    public MyStack() {
    }
 
    public void push(int x) {
        //記錄之前元素的個(gè)數(shù)
        int size = queue.size();
        //將新元素入隊(duì)
        queue.offer(x);
        //將之前的元素依次出隊(duì)再入隊(duì),新元素就在隊(duì)首位置
        for (int i = 0; i < size; i++) {
            queue.offer(queue.poll());
        }
 
    }
 
    public int pop() {
        return queue.poll();
    }
 
    public int top() {
        return queue.peek();
    }
 
    public boolean empty() {
        return queue.isEmpty();
    }
}

這幾個(gè)例題實(shí)踐目的是更加熟悉的掌握和了解棧和隊(duì)列,實(shí)際應(yīng)用中是不推薦的哦。

到此這篇關(guān)于Java 棧和隊(duì)列的相互轉(zhuǎn)換詳解的文章就介紹到這了,更多相關(guān)Java 棧和隊(duì)列 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)連連看算法

    Java實(shí)現(xiàn)連連看算法

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)連連看算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 詳解Java8與Runtime.getRuntime().availableProcessors()

    詳解Java8與Runtime.getRuntime().availableProcessors()

    這篇文章主要介紹了詳解Java8與Runtime.getRuntime().availableProcessors(),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • mybatis 自定義實(shí)現(xiàn)攔截器插件Interceptor示例

    mybatis 自定義實(shí)現(xiàn)攔截器插件Interceptor示例

    這篇文章主要介紹了mybatis 自定義實(shí)現(xiàn)攔截器插件Interceptor,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 玩轉(zhuǎn)SpringBoot2快速整合攔截器的方法

    玩轉(zhuǎn)SpringBoot2快速整合攔截器的方法

    這篇文章主要介紹了玩轉(zhuǎn)SpringBoot2快速整合攔截器的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 淺析java雙向冒泡排序算法

    淺析java雙向冒泡排序算法

    這篇文章主要介紹了淺析java雙向冒泡排序算法,并附上源碼,需要的朋友可以參考下
    2015-02-02
  • SpringBoot?HikariCP連接池詳解

    SpringBoot?HikariCP連接池詳解

    這篇文章主要介紹了SpringBoot2.0?中?HikariCP?數(shù)據(jù)庫(kù)連接池原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • mybatis中<choose>標(biāo)簽的用法說(shuō)明

    mybatis中<choose>標(biāo)簽的用法說(shuō)明

    這篇文章主要介紹了mybatis中<choose>標(biāo)簽的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 二叉搜索樹(shù)實(shí)例練習(xí)

    二叉搜索樹(shù)實(shí)例練習(xí)

    一棵二叉查找樹(shù)是按二叉樹(shù)結(jié)構(gòu)來(lái)組織的。這樣的樹(shù)可以用鏈表結(jié)構(gòu)表示,其中每一個(gè)結(jié)點(diǎn)都是一個(gè)對(duì)象
    2012-11-11
  • 分享令人目瞪口呆的?Java?代碼技巧

    分享令人目瞪口呆的?Java?代碼技巧

    這篇文章主要介紹了令人目瞪口呆的?Java?代碼技巧,本文從寫(xiě)?Java?程序的小方面一直寫(xiě)到大方面,來(lái)闡述了如何才能寫(xiě)好?Java?程序,并告訴讀者們?nèi)绾尾拍芴岣咦陨淼木幋a水平,需要的朋友可以參考下
    2022-05-05
  • SpringBoot如何在普通類加載Spring容器

    SpringBoot如何在普通類加載Spring容器

    這篇文章主要介紹了SpringBoot如何在普通類加載Spring容器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論