棧和佇列相互實現

2021-10-06 06:46:01 字數 2256 閱讀 2861

題目一 佇列實現棧

要求:使用佇列實現棧的下列操作:push(x),pop(),top(),empty()

方法:利用雙佇列deque實現棧,操作方便,效率較高

思路:(1)push()操作,為了保證先進棧的元素一直在棧底,需要將兩個佇列交替使用,才可滿足需求,所以我們在空的佇列新增元素,然後將非空佇列的元素全部追加到當前佇列,然後方便下次新增元素至空佇列。

(2)pop()操作,在新增元素時,我們已經按照進棧的先後順序把新進棧的元素放在乙個佇列的頭部,所以出棧時,我們只需找到非空的佇列將資料依次取出。

(3)top()操作,需將頂部元素取出,將入棧元素依次出棧,再將所要資料取出即可

code

class

solution

:def

__init__

(self)

: self.q1 =

self.q2 =

defpush

(self, x:

int)

:def

pop(self):if

len(self.q1)==0

:print

('empty')if

len(self.q1)==1

:return self.q1.pop(0)

while

len(self.q1)

>1:

0)) res = self.q1.pop(0)

self.q1, self.q2 = self.q2, self.q1

return res

deftop(self)

:while

len(self.q1)!=1

:0))

res = self.q1.pop(0)

return res

defempty

(self)

:return

notbool

(self.q1)

題目二 棧實現佇列

要求:使用棧實現佇列的下列操作:push(x),pop(),peek(),empty()

方法:使用兩個棧實現佇列,操作高效簡潔

思路:入1棧的特點是filo,所以來回操作兩次,就可變成佇列。入棧時,直接進stack1棧,出棧時,先看stack2中是否有元素,如果有,則直接輸出,如果沒有,將1棧元素依次排進2棧後,再進行輸出。

code

class

solution

:def

__init__

(self)

: self.stack1 =

self.stack2 =

defpush

(self, x:

int)

:def

pop(self)

:if self.empty():

return

none

iflen

(self.stack2)

>0:

return self.stack2.pop(

)else

:while

len(self.stack1)

>0:

))return self.stack2.pop(

)def

top(self)

:if self.empty():

return

none

iflen

(self.stack2)

>0:

return self.stack2[-1

]else

:while

len(self.stack1)

>0:

))return self.stack2[-1

]def

empty

(self):if

len(self.stack1)==0

andlen

(self.stack2)==0

:return

true

else

:return

false

理解list函式中pop()操作的真正含義:

(1)pop(0):其意義是輸出list中的首元素,實現佇列效果。

(2)pop()/pop(-1):其意義是輸出list中的末尾元素,實現棧效果。

棧和佇列的相互實現

棧和佇列作為兩種典型的線性表,有著非常鮮明甚至可以說是相互對立的特點 棧先進後出 後進先出 佇列先進先出 後進後出 因此,對相同的輸入,兩者會產生恰好截然相反的輸出。例如,對於給定的序列 abcde 如果按照字母順序將這個5個元素依次入棧,然後再依次出棧,那麼得到的輸出將是 edcba 而如果將5個...

225 232 棧和佇列相互實現

解題思想 佇列的特點是先進先出,用兩個佇列相互資料轉移,實現棧的先進後出。以pop為例,佇列1先進棧,如果要實現出棧,則將佇列1中的元素除了最後乙個元素轉移到佇列2中,再將佇列1中元素移除,實現出棧,下一步繼續入棧,再從佇列2轉移到佇列1.時間複雜度 o n 空間複雜度o 2 n 兩個佇列 解題思想...

棧和佇列的相互實現

兩個棧實現佇列 解題思路 佇列是先進先出,有隊頭和隊尾,因此用第乙個棧的棧頂表示隊頭,第二個表示隊尾。佇列插入的時候是從尾巴插入,因此代表尾部的棧可以定義成乙個插入棧也是隊尾棧。佇列輸出遵守先進先出原則,輸出的元素是隊頭,因此代表頭部的棧可以定義乙個輸出棧也叫隊頭棧。為避免佇列順序錯亂,因此兩個棧在...