棧與佇列之間的相互實現

2021-09-25 10:08:54 字數 2392 閱讀 2182

棧與佇列之間的相互實現,是面試中的經典試題。

入隊:元素進棧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....