国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

算法面試:隊列實現(xiàn)棧的方案

dabai / 1144人閱讀

摘要:基本解決方案按照上述的大體思路,我們給出解決方案入棧和出棧都在中完成,只作為臨時中轉(zhuǎn)空間。入棧入隊出棧除隊尾的元素外將其他所有元素出隊,再入隊中轉(zhuǎn)暫存,然后將中的元素出隊出棧。

聲明:碼字不易,轉(zhuǎn)載請注明出處,歡迎文章下方討論交流。

前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時更新,歡迎各位讀者監(jiān)督。本篇介紹的是如何用兩個隊列實現(xiàn)棧的問題。這道題作為上一篇文章算法面試:棧實現(xiàn)隊列的方案的姊妹篇(也是一道思路拓展題),本文給出問題的解決思路和Java實現(xiàn)代碼。

首先定義兩個隊列分別為queue1和queue2。

1.大體思路:

隊列實現(xiàn)棧,棧的特點是后進的先出,我們可以讓元素入隊queue1,留下隊尾元素讓其他元素出隊,暫存到queue2中,然后讓queue1中剩下的元素出隊,即最后進的最先出來。

2.基本解決方案

按照上述的大體思路,我們給出解決方案:入棧和出棧都在queue1中完成,queue2只作為臨時中轉(zhuǎn)空間。

入棧 入隊queue1

出棧 除queue1隊尾的元素外將其他所有元素出隊queue1,再入隊queue2(中轉(zhuǎn)暫存),然后將queue1中的元素出隊(出棧)。最后一步,將暫存在queue2中的元素再倒回queue1中。

為描述清晰,請看下圖:
事實上,這個思路和用兩個棧實現(xiàn)隊列的方案1類似,都是第二個數(shù)據(jù)區(qū)作為暫存中轉(zhuǎn),最后在倒回到第一個數(shù)據(jù)區(qū)。

3.改進后的方案

上述方案是一個基本的最容易想到的解決方案,但是仔細觀察會發(fā)現(xiàn)其并不完美:在每次出棧步驟中要把queue2中的元素倒回到queue1中,這個操作很累贅,能否優(yōu)化一下,可不可以不用每次先出棧后倒回??下面給出改進后的方案

入棧:

兩個隊列全空:任選一個隊列讓元素入隊,此處規(guī)定queue1

兩個隊列一個空:讓元素入隊非空的隊列

注:不考慮兩個隊列全滿,因為本身沒意義

出棧: 將非空隊列中除最后入隊的元素之外的其他所有元素入隊到另外一個隊列中,然后出隊剩下的那個元素(后進來的先出去,完成出棧)

相比于基本方案,改進后的方案沒有了基本方案中的倒回操作,整個流程變得簡潔高效,下面給出改進方案的java代碼實現(xiàn)。

4.java代碼實現(xiàn)
public class Queues2Stack {
    private ArrayQueue q1;
    private ArrayQueue q2;
    private int maxLength;
    
    public Queues2Stack(int capacity){
        maxLength = capacity;
        q1 = new ArrayQueue(capacity);
        q2 = new ArrayQueue(capacity);
    }
    
    public int getSize(){
        return q1.getsize()+q2.getsize();
    }
    
    /**
     * 入棧:
     * @param element 入棧元素
     * @return 入棧成功結(jié)果?
     */
    public boolean push(int element){
        if(getSize() == maxLength){ //隊列都滿,此情景無意義
            return false;
        }
        if(q2.isEmpty()){
            q1.put(element);
        }else{
            q2.put(element);
        }
        return true;
    }
    
    /**
     * 出棧
     * @return 出棧元素
     */
    public Object pop(){
        if(getSize()==0){
            throw new IndexOutOfBoundsException("空棧,無元素可出棧");
        }else{   //留非空隊列中最后一個元素,其他搬到空隊列中
            if(q2.isEmpty()){  
                while(q1.getsize()>1) q2.put(q1.pull()); 
                return q1.pull();  //出隊最后一個,實現(xiàn)后進先出
            }else{
                while(q2.getsize()>1) q1.put(q2.pull());
                return q2.pull();   //出隊最后一個,實現(xiàn)后進先出
            }
        }
    }
}

測試程序:

public class Queues2StackTest {
    public static void main(String[] args) {
        Queues2Stack s = new Queues2Stack(5);
        s.push(1);
        s.push(2);
        s.push(3);
        System.out.println(s.pop());  //返回3
        s.push(4);
        s.push(5);
        System.out.println(s.pop());  //返回5
        System.out.println(s.pop());  //返回4
        System.out.println(s.pop());  //返回2
        System.out.println(s.pop());  //返回1
        System.out.println(s.pop());  //拋出異常:提示棧為空
    }
}
注:以上代碼用到了堆和棧的代碼,請移步到前兩篇文章獲取Java數(shù)據(jù)結(jié)構(gòu)與算法——棧(stack)和Java數(shù)據(jù)結(jié)構(gòu)與算法——隊列(queue)。

本篇的姊妹篇請移步到之前的文章算法面試:棧實現(xiàn)隊列的方案

歡迎討論提問,覺得文章對您有用,請收藏點個贊 ^_^

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/71013.html

相關(guān)文章

  • 算法面試:棧實現(xiàn)隊列方案

    摘要:解決方案二入隊都在中進行,用于隊列,同時保證所有元素都在一個棧里,且遵循以下約束入隊不管空與否,都將中的所有元素壓入中出隊若中不為空,則直接從中彈出元素若為空,則說明隊列為空,不能出隊。 聲明:碼字不易,轉(zhuǎn)載請注明出處,歡迎文章下方討論交流。 前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時更新,歡迎各位讀者監(jiān)督。本篇文章介紹一個有趣的問題:用兩個棧實現(xiàn)一個隊列。這道題來自互聯(lián)網(wǎng)公司的算法面試...

    韓冰 評論0 收藏0
  • Java 高級面試知識點匯總!

    摘要:適配器模式將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。這個主題對象在狀態(tài)發(fā)生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。 1、常用設(shè)計模式 單例模式:懶漢式、餓漢式、雙重校驗鎖、靜態(tài)加載,內(nèi)部類加載、枚舉類加載。保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。 代理模式:動態(tài)代理和靜態(tài)代理,什么時候使用...

    since1986 評論0 收藏0
  • 【Java】幾道常見的秋招面試

    摘要:總結(jié)的時間復雜度是,是空間是使用輔助棧來存儲最小值。項目就是為了解決配置繁瑣的問題,最大化的實現(xiàn)約定大于配置。 前言 只有光頭才能變強 Redis目前還在看,今天來分享一下我在秋招看過(遇到)的一些面試題(相對比較常見的) 0、final關(guān)鍵字 簡要說一下final關(guān)鍵字,final可以用來修飾什么? 這題我是在真實的面試中遇到的,當時答得不太好,現(xiàn)在來整理一下吧。 final可以修飾...

    Rocko 評論0 收藏0
  • 前端進擊的巨人(二):棧、堆、隊列、內(nèi)存空間

    摘要:中有三種數(shù)據(jù)結(jié)構(gòu)棧堆隊列。前端進擊的巨人一執(zhí)行上下文與執(zhí)行棧,變量對象中解釋執(zhí)行棧時,舉了一個乒乓球盒子的例子,來演示棧的存取方式,這里再舉個栗子搭積木。對于基本類型,棧中存儲的就是它自身的值,所以新內(nèi)存空間存儲的也是一個值。 面試經(jīng)常遇到的深淺拷貝,事件輪詢,函數(shù)調(diào)用棧,閉包等容易出錯的題目,究其原因,都是跟JavaScript基礎(chǔ)知識不牢固有關(guān),下層地基沒打好,上層就是豆腐渣工程,...

    edgardeng 評論0 收藏0
  • PHP面試知識梳理

    摘要:三次握手所謂三次握手,是指簡歷一個連接時需要客戶端和服務(wù)器總共發(fā)送三個包三次握手的目的是連接服務(wù)器指定端口,簡歷連接,并同步連接雙方的序列號并交換窗口大小信息。 關(guān)于作者 昨天在思否上發(fā)了這篇整理,晚上10點多看到了很多贊收藏和關(guān)注,其實挺愧疚的,因為最近在找工作這篇文章并沒有整理完。看到這個還挺受歡迎的,也因為新工作基本定下來了,現(xiàn)在的公司正常交接中,打算下周末之前把這個知識梳理整理...

    archieyang 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<