力扣簡單專欄 225 用佇列實現棧(雙解法)

2021-10-22 02:09:34 字數 2620 閱讀 9516

請你僅使用兩個佇列實現乙個**先出(lifo)的棧,並支援普通佇列的全部四種操作(push、top、pop 和 empty)。

實現 mystack 類:

void push(int x) 將元素 x 壓入棧頂。

int pop() 移除並返回棧頂元素。

int top() 返回棧頂元素。

boolean empty() 如果棧是空的,返回 true ;否則,返回 false 。

注意:你只能使用佇列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 這些操作。

你所使用的語言也許不支援佇列。 你可以使用 list (列表)或者 deque(雙端佇列)來模擬乙個佇列 , 只要是標準的佇列操作即可。

示例:輸入:

[「mystack」, 「push」, 「push」, 「top」, 「pop」, 「empty」]

[, [1], [2], , , ]

輸出:[null, null, null, 2, 2, false]

解釋:mystack mystack = new mystack();

mystack.push(1);

mystack.push(2);

mystack.top(); // 返回 2

mystack.pop(); // 返回 2

mystack.empty(); // 返回 false

1 <= x <= 9

最多呼叫100 次 push、pop、top 和 empty

每次呼叫 pop 和 top 都保證棧不為空

解題關鍵1:

利用另乙個佇列使當前佇列的入隊序列逆置。

思路1:使乙個線性結構的元素逆置,不難想到將頭部元素不斷地新增到尾部。對於佇列而言,尾部是不能插入的,要實現元素逆置就必須在插入元素後,將插入前(除插入元素外)的所有元素出隊並重新插入佇列,佇列每出隊乙個元素後,就插入這個元素。比如,佇列從頭到尾為2,1,現在插入3,得到,2,1,3,此時將3沒有插入前的元素2,1,出隊後再重新插入佇列,則得到3,2,1。由此可見原來的入隊序列為1,2,3。這個演算法是只用了乙個佇列就實現入隊序列逆置,即棧的序列,希望讀者能自行實現。兩個佇列實現棧是基於這個演算法的,理解了這個演算法,本題也就不難解決。現在多了乙個輔助佇列,這個輔助佇列是要先入隊乙個元素,然後將原佇列中的元素出隊到輔助佇列,再將輔助佇列的元素與原佇列的元素互換,則原佇列的入隊元素已經逆置。不難發現這個演算法與之前的演算法的區別在於,第乙個演算法在入隊時是將待插入元素插入到乙個佇列,第二個演算法是將待插入元素插入到另乙個佇列。共同點是pop(),top(),empty()都是針對已逆置元素的佇列。

偽**1:

該演算法是官方的演算法,push()操作時間複雜度為o(n),其餘複雜度為o(1)。顯然,樣例的插入操作頻繁,導致時間效率不高。如果要提高擊敗百分比,應考慮哪種操作樣例執行更頻繁。

解題關鍵2:

設計乙個儲存棧頂元素的佇列。

思路2:如果插入操作頻繁,就有必要考慮使插入操作的複雜度降低到o(1)。這個解法是本人在沒測試前想的,目的是為了使刪除,檢視棧頂操作複雜度降低,結果使插入操作的複雜度降低了,刪除和檢視操作反而是o(n)。輔助佇列要儲存棧頂元素的意思是輔助佇列要麼空要麼只有乙個元素,所以在進行刪除和檢視棧頂操作時,要檢測輔助佇列是否空,若輔助佇列空,則將原佇列的元素全部出隊到輔助佇列,再將輔助佇列除隊尾元素外的元素全部出隊到原佇列,這樣輔助佇列就只剩棧頂元素即原佇列的尾部元素。在輔助佇列不空時,返回輔助佇列的首元素。刪除操作很簡單,呼叫一次檢視棧頂函式,再將輔助佇列出隊。入隊時,首先檢查原佇列是否空,若空則插入元素,初始化原佇列。若原佇列不空,則檢測輔助佇列是否空,若空則直接插入,作為棧頂元素。若不空,則先將原棧頂元素,也就是輔助佇列的首元素出隊到原佇列,再在輔助佇列插入元素。判空操作很簡單,同時滿足兩個佇列空就返回真。

偽**2:

顯然,樣例插入操作非常頻繁,此演算法很適合本題。

力扣 225 用佇列實現棧

一 題目描述 使用佇列實現棧的下列操作 注意 二 解題思路 建立兩個佇列a和b。入棧 將新元素直接入a佇列即可。出棧 將a中的元素轉到b中,當a中只有乙個元素時,出隊即可。然後交換a和b的身份。取棧頂元素 將a中的元素轉到b中,當a中只有乙個元素時,取出最後乙個元素出隊,然後將其入b佇列。然後交換a...

力扣 225題用佇列實現棧

使用佇列實現棧的下列操作 push x 元素 x 入棧 pop 移除棧頂元素 top 獲取棧頂元素 empty 返回棧是否為空 注意 你只能使用佇列的基本操作 也就是 push to back,peek pop from front,size,和 is empty 這些操作是合法的。你所使用的語言也...

棧 佇列 力扣 232 用棧實現佇列

實現myqueue類 說明 示例 1 輸入 myqueue push push peek pop empty 1 2 輸出 null,null,null,1,1,false 解釋 myqueue myqueue new myqueue myqueue.push 1 queue is 1 myqueu...