棧與佇列之間的相互實現,是面試中的經典試題。
入隊:元素進棧a
出隊:先判斷棧b是否為空,為空則將棧a中的元素 pop 出來並 push 進棧b,再棧b出棧,如不為空則棧b直接出棧
複雜度分析:
這樣用兩個棧實現乙個佇列,入隊的複雜度為o(1),出隊的複雜度則變為o(n)。
而直接用 python 的單個列表實現佇列,以列表首作為佇列尾,則入隊用insert,複雜度為o(n),出隊用pop,複雜度為o(1)。(列表首,即列表中下標為0的元素)
實現:就以列表作為棧的底層實現,只要保證後進先出的約束就是棧。這裡只實現入隊和出隊兩個操作。
class
queue:
def__init__
(self):
self.stocka=
self.stockb=
defpush
(self, node):
defpop(self):
if self.stockb==:
if self.stocka==:
return
none
else:
for i in range(len(self.stocka)):
return self.stockb.pop()
可以用簡單的例項來測試一下是否成功實現了佇列
if __name__=='__main__':
times=5
testlist=list(range(times))
testqueue=queue()
for i in range(times):
testqueue.push(testlist[i])
print(testlist)
for i in range(times):
print(testqueue.pop(),',',end='') #end=''可以讓 print 輸出不換行
#輸出結果:先進先出
[0, 1, 2, 3, 4]
0 ,1 ,2 ,3 ,4 ,
附上牛客網上劍指offer的試題:用兩個棧來實現佇列
進棧:元素入佇列a
複雜度分析:
再用pop去彈出隊首,也就是列表第0個元素,彈出後插入到另乙個佇列中。第一次 pop,需要移動列表後面n-1個元素,第二次 pop,需要移動後面n-2個元素……直到最後只剩最後乙個元素,直接出隊。
複雜度:(n-1)+(n-2)+……+1=o(n^2)。
第二種形式:如果以列表首作為隊尾,用 insert 插入新元素,需要移動後面的元素,複雜度則為o(n)。
再用pop去彈出隊首,也就是列表最後乙個元素,彈出後插入到另乙個佇列中。這樣操作雖然彈出元素的複雜度為o(1),但再插入另乙個佇列的複雜度則為o(n),因為要連續彈出n-1個元素,則需要連續插入n-1個元素,最後的複雜度同樣會是o(n^2)。
因此選擇第一種形式。
而直接用python的乙個列表實現棧,以列表尾為棧首,則出棧和進棧的複雜度都為o(1)。
實現:就以列表作為佇列的底層實現,只要保證先進先出的約束就是佇列。這裡只實現進棧和出棧兩個操作。
class
stock:
def__init__
(self):
self.queuea=
self.queueb=
defpush
(self, node):
defpop(self):
if len(self.queuea)==0:
return
none
while len(self.queuea)!=1:
self.queuea,self.queueb=self.queueb,self.queuea #交換是為了下一次的pop
return self.queueb.pop()
可以用簡單的例項來測試一下是否成功實現了棧
if __name__=='__main__':
times=5
testlist=list(range(times))
teststock=stock()
for i in range(times):
teststock.push(testlist[i])
print(testlist)
for i in range(times):
print(teststock.pop(),',',end='')
#輸出結果:後進先出
[0, 1, 2, 3, 4]
4 ,3 ,2 ,1 ,0 ,
棧與佇列之間的相互實現,是面試中的經典試題。
佇列結構與棧結構之間的相互實現
如何僅用佇列結構實現棧結構?思路 用兩個佇列,乙個用於存放資料 queue 當要取出資料時,把除了queue佇列頭以為的資料依次存到的另乙個佇列 help 中,再把佇列頭取出,然後改變queue和help的指向,資料僅能從queue佇列存入。具體實現 public static class twoq...
佇列與棧的相互實現
problem 如何僅用佇列結構實現棧結構?solution 佇列是先進先出,而棧是先進後出 故使用兩個佇列來實現乙個棧的功能 乙個存放原來的資料,另乙個做資料倒騰的容器 code 1 class queuetostack211 inttop 1219 int res data.front 20te...
棧與佇列的相互轉換實現
一 使用兩個棧實現乙個佇列 棧s1,s2 入隊操作 入棧操作,count 1 出隊操作 s1出棧,入棧s2,出棧s2 具體實現 include includeusing namespace std 利用兩個棧實現乙個佇列 templateclass myque void push t elem q....