python兩個佇列實現乙個棧 py兩個棧實現佇列

2021-10-11 22:34:09 字數 2104 閱讀 8133

純粹是為了提高專注度,逼迫自己放下手機,就來寫一寫這個東西。

用兩個棧來實現乙個佇列,leetcode劍指offer第9題,鏈結如下

寫在前面:棧:先進後出

佇列:先進先出

兩者都是限制訪問點的線性結構。

解決問題:

出棧:list.pop() 彈出列表最後乙個元素

list 的 pop 功能實現棧的 pop 操作

所以棧我們有了,題目中說讓使用兩個棧,我們使用乙個具體例子來說明一下:現在是 佇列的 push 操作,依次push了 1 2 3 4 5,那棧中的元素如下圖中的(1)所示。

那如果現在要pop呢?根據佇列的性質,我們應該首先pop的是1,但是我們用的是棧,如果

把在這個過程中棧

python**實現:

class cqueue:

def __init__(self):

self.a,self.b = ,

def deletehead(self) -> int:

# 緩衝區有內容,直接pop最頂層

if self.b : return self.b.pop()

# 緩衝區和儲存區都空,是個空佇列,返回-1

if not self.a: return -1

# 緩衝區為空,將儲存區的資料壓入緩衝區

while self.a:

return self.b.pop()

至於他的pop操作:首先,緩衝區中有資料,則直接緩衝區pop就行

緩衝區沒資料,儲存區也沒資料,那就直接空了啊,返回-1

緩衝區沒資料,儲存區有資料,那就說明你上一把緩衝的最早的一些資料已經pop完了,你再把儲存區的資料再全部放到緩衝區去,以備待用。再緩衝區pop,完事。

有一點很重要,一定要緩衝區為空之後,儲存區的資料才能再次轉移。才能保證佇列彈出資料的正確性。

變形金剛之問題高階:

其實這道題也還行,我今天吧,做牛客網上京東那個演算法崗的試題,有個問題是這樣的:

用倆個棧模擬實現乙個佇列,如果棧的容量分別是o和p(o>p),那麼模擬實現的佇列最大容量是多少?

這個,害,菜鳥的我當然一上來就蒙了啊。首先的首先,咱們得理解啥叫容量吧?應該就是你乙個勁的乙個勁地push進去,不准中途pop,直到你再push進去的話,再pop出來的就不是列表正常的pop了,就破壞列表結構了。所以咱們理解起來就是:不影響佇列性質的前提下,能一直pop進去的元素數目。

然後才是首先,o和p,儲存區和快取區的選擇。如果p是儲存區,p裝滿後,往o移動,移動完了之後,o沒滿,p為空,再不pop的前提下,p還能裝p個。這個時候o雖然不是空的,但是不能往o轉移,因為那樣會亂了佇列的彈出順序。所以這個容量就是2p。

如果o是儲存區的話,o不能直接裝滿,因為裝滿的話轉移到p中,p的棧頂元素不是第乙個進去o的元素,所以一開始只能裝p個,o裝完p個,往p裡轉移,o還可以裝p個肯定沒問題,這緩衝區p本來就有p個,pop出去,順序沒問題,o裡新裝的p個,也轉到緩衝區再pop出去,也沒問題。那如果o這次多裝乙個呢,裝p+1個的話,p個被轉移到p裡(第p+2到2p+1個元素),o裡還剩乙個(第p+1個),那這乙個(第p+1個元素)會轉移到p裡,那麼這個時候如果我們pop o中的元素,就成功的pop出了第p+1個元素,然後再pop p裡的p個元素,這個順序是沒錯的。所以說第二次裝p+1個沒問題耶。那大膽一點,再多裝乙個?假設第二次裝了p+2個,那前p個被移到緩衝區,o裡還剩兩個(第p+1,p+2個),那這個時候無論pop哪個棧裡的元素,都沒辦法把第p+1個元素pop出來,所以不行了。所以,只能多乙個,也就是容量是2p+1。

容量是2p+1的前提是,儲存區在p+1的時候pop了,之前咱們實現的棧,pop是緩衝區的事哦。

所以記住了:兩個棧實現佇列的最大容量為 2p+1 ,其中p是較小的棧的容量,且大棧當儲存區,小棧當緩衝區。大棧需要pop出第p+1個元素。

在整個出隊的過程中為了實現最大容量,不僅僅只有s2在輸出,在必要的時候(即第p+1元素),s1也要直接輸出,但是必須明白的是,s1最多只能直接輸出乙個元素(即s1中最多儲存p+1個元素),多出兩個往上都會違反佇列的先進先出原則。

參考一下哦:用兩個棧模擬乙個佇列,棧的容量分別是o和p(o>p),討論佇列可以實現的最大容量_平凡之路-csdn部落格_用倆個棧模擬實現乙個佇列,如果棧的容量分別是o和p(o>p),那麼模擬實現的佇列最大​blog.csdn.net

兩個棧實現乙個佇列 兩個佇列實現乙個棧

這兩個題的思路比較相似。棧的特點是 先進後出 佇列的特點是 先進先出 不要怕!用兩個棧實現乙個佇列很簡單 再將top元素push到stack 2中,然後將stack 1 pop一次直到stack 1剩下最後乙個元素,這個就是最先push進去的,我們把它pop掉就可以了,同理,我們求queue的fro...

兩個棧實現乙個佇列,兩個佇列實現乙個棧

1 兩個棧實現乙個佇列 入隊時,直接壓入stack1中。出隊時,判斷stack2是否為空,如果stack2為空,則將stack1中的元素倒入stack2中,否則直接彈出stack2中的元素。入隊操作 void enqueue stack s1,stack s2,int m 出隊操作 void deq...

兩個棧實現乙個佇列 兩個佇列實現乙個棧

方法一 public class main 出棧操作 public int deletehead while stack1.isempty return stack2.pop 方法二 public class main public int deletehead throws exception i...