算法 1.4.1 用棧實(shí)現(xiàn)隊(duì)列【leetcode 232】

題目描述

請(qǐng)你僅使用兩個(gè)棧實(shí)現(xiàn)先入先出隊(duì)列。隊(duì)列應(yīng)當(dāng)支持一般隊(duì)列的支持的所有操作(push、pop、peek、empty):

實(shí)現(xiàn) MyQueue 類:
void push(int x) 將元素 x 推到隊(duì)列的末尾
int pop() 從隊(duì)列的開頭移除并返回元素
int peek() 返回隊(duì)列開頭的元素
boolean empty() 如果隊(duì)列為空撩嚼,返回 true ;否則挖帘,返回 false

說(shuō)明:
你只能使用標(biāo)準(zhǔn)的棧操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的完丽。
你所使用的語(yǔ)言也許不支持棧。你可以使用 list 或者 deque(雙端隊(duì)列)來(lái)模擬一個(gè)棧,只要是標(biāo)準(zhǔn)的棧操作即可。

進(jìn)階:
你能否實(shí)現(xiàn)每個(gè)操作均攤時(shí)間復(fù)雜度為 O(1) 的隊(duì)列掠抬?換句話說(shuō),執(zhí)行 n 個(gè)操作的總時(shí)間復(fù)雜度為 O(n) 聘鳞,即使其中一個(gè)操作可能花費(fèi)較長(zhǎng)時(shí)間。

示例:
輸入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
輸出:
[null, null, null, 1, 1, false]

解釋:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false

提示:
1 <= x <= 9
最多調(diào)用 100 次 push要拂、pop抠璃、peek 和 empty
假設(shè)所有操作都是有效的 (例如,一個(gè)空的隊(duì)列不會(huì)調(diào)用 pop 或者 peek 操作)

數(shù)據(jù)結(jié)構(gòu)

算法思維

  • 棧操作

解題要點(diǎn)

  • 棧的 LIFO 特性
  • 隊(duì)列的 FIFO 特性

解題思路

一. Comprehend 理解題意
  • 需要自實(shí)現(xiàn)一個(gè)隊(duì)列
  • 只能使用兩個(gè)棧作為數(shù)據(jù)結(jié)構(gòu)
  • 只能使用棧操作(push(x), pop(), peek(), isEmpty())來(lái)實(shí)現(xiàn)隊(duì)列功能
二. Choose 選擇數(shù)據(jù)結(jié)構(gòu)與算法
解法一:兩棧相互 壓入/彈出 元素
  • 數(shù)據(jù)結(jié)構(gòu):棧
  • 算法思維:棧操作
三. Code 編碼實(shí)現(xiàn)基本解法
class MyQueue {

    Stack < Integer > s1; //入隊(duì)所用的 push 棧
    Stack < Integer > s2; //出隊(duì)所用的 pop 棧

    /**
     * Initialize your data structure here.
     */
    public MyQueue() {
        s1 = new Stack < > ();
        s2 = new Stack < > ();
    }

    /**
     * Push element x to the back of queue.
     */
    public void push(int x) {
        //1.入隊(duì)前脱惰,先將s2中的所有元素移入s1中
        while(!s2.isEmpty()) {
            s1.push(s2.pop());
        }
        //2.入隊(duì) == 入s1棧
        s1.push(x);
    }

    /**
     * Removes the element from in front of queue and returns that element.
     */
    public int pop() {
        //3.出隊(duì)前搏嗡,先將s1中的所有元素移入s2中
        while(!s1.isEmpty()) {
            s2.push(s1.pop());
        }
        //4.出隊(duì) == 出s2棧
        return s2.pop();
    }

    /**
     * Get the front element.
     */
    public int peek() {
        //5.查詢隊(duì)首,與出隊(duì)類似,先將s1中的所有元素移入s2中
        while(!s1.isEmpty()) {
            s2.push(s1.pop());
        }
        //6.查詢隊(duì)首 == 查詢s2棧頂
        return s2.peek();
    }

    /**
     * Returns whether the queue is empty.
     */
    public boolean empty() {
        //7.空隊(duì)為空 == s1和s2同時(shí)為空
        return s1.isEmpty() && s2.isEmpty();
    }

}

執(zhí)行耗時(shí):0 ms拉一,擊敗了 100.00% 的Java用戶
內(nèi)存消耗:36.1 MB采盒,擊敗了 92.05% 的Java用戶
時(shí)間復(fù)雜度:O(n2) -- 每次出入隊(duì)都執(zhí)行1次棧的遍歷 O(n2),出入棧操作 O(1)
空間復(fù)雜度:O(n) -- 棧的內(nèi)存空間 O(n)

四. Consider 思考更優(yōu)解

優(yōu)化代碼結(jié)構(gòu)
改變算法思維
借鑒其他算法

思路:
方法:
解法二:XXX
  • 數(shù)據(jù)結(jié)構(gòu):
  • 算法思維:
五. Code 編碼實(shí)現(xiàn)最優(yōu)解

執(zhí)行耗時(shí):
內(nèi)存消耗:
時(shí)間復(fù)雜度:O() --
空間復(fù)雜度:O() --

六. Change 變形與延伸

=== 待續(xù) ===

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蔚润,一起剝皮案震驚了整個(gè)濱河市磅氨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嫡纠,老刑警劉巖烦租,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異除盏,居然都是意外死亡叉橱,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門痴颊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赏迟,“玉大人屡贺,你說(shuō)我怎么就攤上這事蠢棱⌒可保” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵泻仙,是天一觀的道長(zhǎng)糕再。 經(jīng)常有香客問(wèn)我,道長(zhǎng)玉转,這世上最難降的妖魔是什么突想? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮究抓,結(jié)果婚禮上猾担,老公的妹妹穿的比我還像新娘。我一直安慰自己刺下,他們只是感情好绑嘹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著橘茉,像睡著了一般工腋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上畅卓,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天擅腰,我揣著相機(jī)與錄音,去河邊找鬼翁潘。 笑死趁冈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的唐础。 我是一名探鬼主播箱歧,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼一膨!你這毒婦竟也來(lái)了呀邢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤豹绪,失蹤者是張志新(化名)和其女友劉穎价淌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瞒津,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蝉衣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巷蚪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片病毡。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖屁柏,靈堂內(nèi)的尸體忽然破棺而出啦膜,到底是詐尸還是另有隱情有送,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布僧家,位于F島的核電站雀摘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏八拱。R本人自食惡果不足惜阵赠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肌稻。 院中可真熱鬧清蚀,春花似錦、人聲如沸爹谭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)旦棉。三九已至齿风,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绑洛,已是汗流浹背救斑。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留真屯,地道東北人脸候。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像绑蔫,于是被迫代替她去往敵國(guó)和親运沦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容