題目一 佇列實現棧
要求:使用佇列實現棧的下列操作: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
('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
注理解list函式中pop()操作的真正含義: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
(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 兩個佇列 解題思想...
棧和佇列的相互實現
兩個棧實現佇列 解題思路 佇列是先進先出,有隊頭和隊尾,因此用第乙個棧的棧頂表示隊頭,第二個表示隊尾。佇列插入的時候是從尾巴插入,因此代表尾部的棧可以定義成乙個插入棧也是隊尾棧。佇列輸出遵守先進先出原則,輸出的元素是隊頭,因此代表頭部的棧可以定義乙個輸出棧也叫隊頭棧。為避免佇列順序錯亂,因此兩個棧在...