切換
舊版
前往
大廳
主題

LeetCode - 225. Implement Stack using Queues 解題心得

Not In My Back Yard | 2020-09-15 22:20:53 | 巴幣 4 | 人氣 194

題目連結:


題目意譯:
使用佇列(Queue)實作下列堆疊(Stack)的操作。

push(x) —— 將元素 x 推到堆疊頂端。
pop() —— 將堆疊頂端的元素移除。
top() —— 取得頂端的元素。
empty() —— 回傳堆疊是否為空。

注:
你只能使用佇列的標準操作——意即放入佇列尾端、查看/移除前端元素、查看大小以及判斷是否為空等操作是唯一允許的。

根據你所使用的程式語言,佇列可能沒有直接支援。取而代之的,你可以使用列表(List)或是雙端佇列(Deque 或稱 Double-ended queue)來模擬一個佇列,但仍只能使用佇列的標準操作。

你可以假設所有操作是合法的(例如,不會有 pop 或是 top 操作在堆疊為空時呼叫)。



範例測資:
MyStack stack = new MyStack();

stack.push(1);
stack.push(2);  
stack.top();   // 回傳 2
stack.pop();   // 回傳 2
stack.empty(); // 回傳 false


解題思維:
因為兩個堆疊可以模擬一個佇列,見此題。類似地,兩個佇列也可以模擬一個堆疊。

利用一布林變數 now (初始值兩個都可以用)代表現在要用兩個佇列(最一開始皆為空)中的哪一個。當 now = false 時,使用第一個佇列;now = true 時,使用第二個佇列。!now 代表的是翻轉不是 now 的那個值,因此 now 為 true 則結果為 false ;now 為 false 則結果為 true。



當呼叫 push(x) 時,將 x 推入 now 佇列(參見上面的對照),然後將 !now 佇列的所有元素 pop 掉並推入 now 佇列的尾端。然後將 now 的值更新為 !now 。

由於佇列是先進先出,因此先將元素 x 堆到一個空的佇列,然後另一個佇列的所有元素直接搬到這個佇列的尾端。因此,這便形成了後進先出(因為最後進的元素 x 會最早被 pop 掉,因其在佇列的前端)

當呼叫 pop() 時,從 !now 佇列 pop 掉前端元素,並回傳剛剛移除掉的前端元素之值。

當呼叫 top() 時,回傳 !now 佇列的前端元素之值。

當呼叫 empty() 時,回傳 !now 佇列.empty() 之結果即可。


由上可以看到,變數 now 隨時都是在指向著空的佇列。正因為有多一個暫存區將新進的元素與先前的元素區隔,所以才可以將佇列的先進先出變為堆疊的後進先出。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作