劍指offer 5 用兩個棧實現佇列 Python

2021-10-06 06:58:27 字數 1144 閱讀 9396

用兩個棧來實現乙個佇列,完成佇列的push和pop操作。 佇列中的元素為int型別。

棧:先進後出 佇列:先進先出

1.先定義兩個空棧,stack1負責入棧,stack2負責出棧。

2.利用push()將元素壓入stack1中:[1,2,3],此時stack2是空的

3.將stack1的所有元素pop出並push到stack2中:[3,2,1],stack2pop出的元素即為res:[1,2,3]。

4.stack2中的元素如果沒有pop結束[3,2],即如果stack1中插入新的元素[4],這時如果將stack1中新的元素插入到stack2中[3,2,4],輸出的順序就會出現問題[4,2,3]。於是對stack2進行判斷,如果沒有pop結束,就把裡面所有元素再push到stack1:[2,3],回到步驟2,這時就算插入新的元素也是:[2,3,4],順序沒有亂。

# -*- coding:utf-8 -*-

class

solution

:def

__init__

(self)

: self.stack1 =

self.stack2 =

defpush

(self, node)

:# write code here

defpop

(self):if

not self.stack1:

return

none

while self.stack1:))

res = self.stack2.pop(

)while self.stack2:))

return res

討論裡有大佬說的蠻好的,複製如下,增加理解:

1,整體思路是元素先依次進入棧1,再從棧1依次彈出到棧2,然後彈出棧2頂部的元素,整個過程就是乙個佇列的先進先出

2,但是在交換元素的時候需要判斷兩個棧的元素情況:

「進佇列時」,佇列中是還還有元素,若有,說明棧2中的元素不為空,此時就先將棧2的元素倒回到棧1 中,保持在「進佇列狀態」。

「出佇列時」,將棧1的元素全部彈到棧2中,保持在「出佇列狀態」。

所以要做的判斷是,進時,棧2是否為空,不為空,則棧2元素倒回到棧1,出時,將棧1元素全部彈到棧2中,直到棧1為空。

劍指offer 5 用兩個棧實現佇列

題目描述 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。思路 棧 先進後出,佇列 先進先出 1 2 3 棧 3 2 1 1 2 3 佇列 1 2 3 stack1進棧後為1 2 3 出棧並儲存在stack2中為3 2 1,stack2出棧就和佇列一致了。push,...

劍指offer 5 用兩個棧實現佇列

題目描述 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。解題思路 需要用棧來模擬佇列的push和pop操作。要知道,棧是先進後出,而佇列是先進先出,所以用棧實現佇列的時候,需要兩個棧,進棧可以直接進棧就ok,但是需要首先將兩個棧合為乙個棧,但是出棧的話,需要將原先...

劍指Offer 5 用兩個棧實現佇列

description用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。注 不考慮邊緣情況,如 在兩個stack都空的時候pop 作為乙個lifo的資料結構,stack中的元素在彈出的時候為反序。而為了實現乙個fifo的queue,我們就需要將反序的元素再push進令...