應用題 用Stack實作Queue_Leetcode #232 Implement Queue using Stacks

閱讀時間約 5 分鐘
raw-image

這題的題目在這裡

題目敘述

題目會給我們一組定義好的Queue 佇列的介面,要求底層用兩個stack來實現。

也就是說,要求我們用兩個LIFO的stacks去實作出一個FIFO的Queue


測試範例

Example 1:

Input
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
Output
[null, null, null, 1, 1, false]

Explanation
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

約束條件

Constraints:

  • 1 <= x <= 9
  • At most 100 calls will be made to pushpoppeek, and empty.
  • All the calls to pop and peek are valid.

 

Follow-up: Can you implement the queue such that each operation is amortized O(1) time complexity? In other words, performing n operations will take overall O(n) time even if one of those operations may take longer.


演算法

關鍵點在於用LIFO的特質,去組合、實作出FIFO的功能

其實可以這樣想,既然是LIFO,代表可以用第一個stack作為輸入的buffer,用第二個stack作為輸出的buffer。

這樣一來,每個元素等於依照順序進出了stack兩次,LIFO 再 LIFO,等價於 FIFO

例如 輸入順序是 [1, 2, 3],再逐一pop出來,再推入另一個stack,
此時變成[3, 2, 1]

這時候再依序pop出來,就會得到1, 2, 3,剛好就是我們原本想要的FIFO輸出順序。


程式碼

class MyQueue:

def __init__(self):
 """  Initialize your data structure here.  """
 self.inbox = []
 self.outbox = []
 
 

def push(self, x: int) -> None:
 """  Push element x to the back of queue.  """
 self.inbox.append( x )
 

def pop(self) -> int:
 """  Removes the element from in front of queue and returns that element.  """

 self.peek()
 return self.outbox.pop()
 
 
def peek(self) -> int:
 """  Get the front element.  """
 
 if len( self.outbox ) != 0:
  return self.outbox[-1]
 
 else:
  
  while len(self.inbox) != 0:
   
   top_of_inbox = self.inbox.pop()
   self.outbox.append( top_of_inbox )
 
  return self.outbox[-1]
 

def empty(self) -> bool:
 """  Returns whether the queue is empty.  """
 
 if len(self.inbox) + len(self.outbox) == 0:
  return True
 else:
  return False



複雜度分析

時間複雜度: amortized O(1)

init(), push(), empty() 函數的時間複雜度為O(1) 。

peek() , pop() 在每次呼叫中,會把原本的順序再翻轉一次,從LIFO轉為FIFO,平均攤銷時間複雜度為O (1)

空間複雜度: O(n)

stack所耗用最大長度就是元素總數。


關鍵知識點

關鍵點在於用LIFO的特質,去組合、實作出FIFO的功能

每個元素依照順序進出了stack兩次,LIFO 再 LIFO,等價於 FIFO


Reference:

[1] Python/JS/Java/C++ sol by two stacks [w/ Comment] - Implement Queue using Stacks - LeetCode

81會員
417Content count
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述 這題是一個經典的資料結構實作題,要求我們實作指定長度為k的環狀佇列。 請記得,佇列最重要的特質就是先進先出 First In First Out 又簡稱為 FIFO
題目會給定一個字串s,把裡面的星號*視為鍵盤上的backspace,往前(往左方)吃掉最靠近的字元。 請位最後全部操作完以後,剩下的字串內容為何? 例如: abc**,最後剩下a。 說明: bc分別被右邊的星號給吃掉。
題目會給定一個字串s,裡面都是由() [] {}打散交錯而成。 問我們給定的輸入字串s裡面,最長的合法括弧配對字串長度是多少? 例如 s = "()()" ,最長的合法括弧配對字串長度為4
題目會給定一個字串s,裡面都是由() [] {}打散交錯而成。 問我們給定的輸入字串s 是不是合法括弧自串,也就是所有的右括弧都在左括弧後面,而且可以兩兩相消。
題目會給定我們一個串列,和一個n值,要求我們刪除尾巴數來的第n個節點。 例如 1->2->3->4->5 和 給定n值=2,要求我們刪除尾巴數來的第2個節點。 尾巴數來的第2個節點是4,刪除之後,更新連結,輸出答案如下 1->2->3->5
題目會給定我們一個n值,問我們n! 也就是n階乘 尾巴的零有多少個? 例如n=5 就是代表5! = 5x4x3x2x1=120 尾巴有一個零,回傳1
題目敘述 這題是一個經典的資料結構實作題,要求我們實作指定長度為k的環狀佇列。 請記得,佇列最重要的特質就是先進先出 First In First Out 又簡稱為 FIFO
題目會給定一個字串s,把裡面的星號*視為鍵盤上的backspace,往前(往左方)吃掉最靠近的字元。 請位最後全部操作完以後,剩下的字串內容為何? 例如: abc**,最後剩下a。 說明: bc分別被右邊的星號給吃掉。
題目會給定一個字串s,裡面都是由() [] {}打散交錯而成。 問我們給定的輸入字串s裡面,最長的合法括弧配對字串長度是多少? 例如 s = "()()" ,最長的合法括弧配對字串長度為4
題目會給定一個字串s,裡面都是由() [] {}打散交錯而成。 問我們給定的輸入字串s 是不是合法括弧自串,也就是所有的右括弧都在左括弧後面,而且可以兩兩相消。
題目會給定我們一個串列,和一個n值,要求我們刪除尾巴數來的第n個節點。 例如 1->2->3->4->5 和 給定n值=2,要求我們刪除尾巴數來的第2個節點。 尾巴數來的第2個節點是4,刪除之後,更新連結,輸出答案如下 1->2->3->5
題目會給定我們一個n值,問我們n! 也就是n階乘 尾巴的零有多少個? 例如n=5 就是代表5! = 5x4x3x2x1=120 尾巴有一個零,回傳1
你可能也想看
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
AI的簡介:人工智能(Artificial Intelligence,簡稱AI)已經深入我們的日常生活,改變了我們的生活方式,並為我們帶來了更多便利。這篇文章將探討人工智能在生活中的多個應用,並簡單介紹幾款具有代表性的AI應用程序,讓你更了解這項令人振奮的AI技術。
Thumbnail
對於陌生人事物我們的本能反應是:從害怕到排斥;從排斥到躲藏,這其實也是一種自我保護機制,學語言的概念也是如此,這篇文章將以主題桌遊戲為例,告訴你如何降低本能防衛心及緊張感,在遊戲中輕鬆愉快的學習英文並應用。
Thumbnail
在ChatGPT橫空出世的當下😮,如何提一個好問題或是下一個好指令,成為人們的新技能🎯,但是身為老師的您,真的會問好問題嗎🤔?還有良好的提問技巧您掌握住了嗎🎓? 在課堂上,問題提問是一個重要的環節,有助於引導學生思考和參與🌟。 以下是一些常用的提問公式,以及在課堂上的應用和範例📚。
Thumbnail
在台灣,常常使用含糊不清且引人注目的方式以吸引眼球,這現象在 Wikipedia 的「台灣媒體亂象」一頁也有特別說明。 那麼,ChatGPT能否替代人類新聞標題寫手,並具有多強的能力呢?本文將深入探討。
Thumbnail
聽見能量、聽見方法,聽見聲音在說話! Hi 你今天過的好嗎?我是雷恩。 在生活或工作中,我們常常會遇到複雜繁瑣的問題需要解決。而在我們面對各類不同的問題時,要如何看透問題的本質,精準地解決問題呢? 這個時候,我們可以利用 MECE 原則來幫助我們。
Thumbnail
有時遇到對方喋喋不休,你很想拿一塊布把對方的嘴塞起來。或者你當下很忙,實在沒時間聽對方講話。這時候你會說「我們先停一下晚點再講好不好?」英日文會怎麼說呢?
Thumbnail
面對有些人是天生的戲劇派、是天生的八卦製造機,或是喜歡一哭二鬧三上吊的恐怖情人,當你想對著他們說「不要小題大作」,英日文各自有很奇特的慣用句,介紹給大家。
上週我們討論了心錨的基本概念,我們可以怎麼使用這樣的工具來協助自己或別人呢?這週我們就來討論心錨的應用吧! 在催眠的過程中,我們進入了潛意識狀態,在這個時候我們可以更容易地透過各種方法找出並保存當下的美好感受,當我們回到日常生活,遇見不開心的事情,當我們又回到我們的慣性而無法讓自己回到穩定狀態的時候
Thumbnail
產品經理的面試一般都會問哪些問題呢?綜合我自己的招聘經驗,我覺得產品經理面試基本上就是針對個人潛力、通用能力、專業能力三大方面評量,會想了解……
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
AI的簡介:人工智能(Artificial Intelligence,簡稱AI)已經深入我們的日常生活,改變了我們的生活方式,並為我們帶來了更多便利。這篇文章將探討人工智能在生活中的多個應用,並簡單介紹幾款具有代表性的AI應用程序,讓你更了解這項令人振奮的AI技術。
Thumbnail
對於陌生人事物我們的本能反應是:從害怕到排斥;從排斥到躲藏,這其實也是一種自我保護機制,學語言的概念也是如此,這篇文章將以主題桌遊戲為例,告訴你如何降低本能防衛心及緊張感,在遊戲中輕鬆愉快的學習英文並應用。
Thumbnail
在ChatGPT橫空出世的當下😮,如何提一個好問題或是下一個好指令,成為人們的新技能🎯,但是身為老師的您,真的會問好問題嗎🤔?還有良好的提問技巧您掌握住了嗎🎓? 在課堂上,問題提問是一個重要的環節,有助於引導學生思考和參與🌟。 以下是一些常用的提問公式,以及在課堂上的應用和範例📚。
Thumbnail
在台灣,常常使用含糊不清且引人注目的方式以吸引眼球,這現象在 Wikipedia 的「台灣媒體亂象」一頁也有特別說明。 那麼,ChatGPT能否替代人類新聞標題寫手,並具有多強的能力呢?本文將深入探討。
Thumbnail
聽見能量、聽見方法,聽見聲音在說話! Hi 你今天過的好嗎?我是雷恩。 在生活或工作中,我們常常會遇到複雜繁瑣的問題需要解決。而在我們面對各類不同的問題時,要如何看透問題的本質,精準地解決問題呢? 這個時候,我們可以利用 MECE 原則來幫助我們。
Thumbnail
有時遇到對方喋喋不休,你很想拿一塊布把對方的嘴塞起來。或者你當下很忙,實在沒時間聽對方講話。這時候你會說「我們先停一下晚點再講好不好?」英日文會怎麼說呢?
Thumbnail
面對有些人是天生的戲劇派、是天生的八卦製造機,或是喜歡一哭二鬧三上吊的恐怖情人,當你想對著他們說「不要小題大作」,英日文各自有很奇特的慣用句,介紹給大家。
上週我們討論了心錨的基本概念,我們可以怎麼使用這樣的工具來協助自己或別人呢?這週我們就來討論心錨的應用吧! 在催眠的過程中,我們進入了潛意識狀態,在這個時候我們可以更容易地透過各種方法找出並保存當下的美好感受,當我們回到日常生活,遇見不開心的事情,當我們又回到我們的慣性而無法讓自己回到穩定狀態的時候
Thumbnail
產品經理的面試一般都會問哪些問題呢?綜合我自己的招聘經驗,我覺得產品經理面試基本上就是針對個人潛力、通用能力、專業能力三大方面評量,會想了解……