gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

一起來分析Python隊列相關應用與習題

本篇文章給大家帶來了關于python的相關知識,其中主要介紹了隊列相關的應用于習題,包括了怎么使用兩個棧來實現一個隊列,怎么使用兩個隊列實現一個棧,棧中元素連續性判斷等等,希望對大家有幫助。

一起來分析Python隊列相關應用與習題

推薦學習:python教程

0. 學習目標

我們已經學習了隊列的相關概念以及其實現,同時也了解了隊列在實際問題中的廣泛應用,本節的主要目的是通過隊列的相關習題來進一步加深對隊列的理解,同時能夠利用隊列降低一些復雜問題解決方案的時間復雜度。

1. 使用兩個棧實現一個隊列

[問題] 給定兩個棧,僅使用棧的基本操作實現一個隊列。

[思路] 解決此問題的關鍵在于棧的反轉特性,入棧的一系列元素在出棧時會以相反的順序返回。因此,使用兩個棧就可以實現元素以相同的順序返回(反轉的元素序列再次反轉后就會得到原始順序)。具體操作如下圖所示:

一起來分析Python隊列相關應用與習題

[算法]

?入隊 enqueue
???將元素推入棧 stack_1
?出隊 dequeue
???如果棧 stack_2 不為空:
?????stack_2 棧頂元素出棧
???否則:
?????將所有元素依次從 stack_1 彈出并壓入 stack_2
?????stack_2 棧頂元素出棧

[代碼]

class Queue:     def __init__(self):         self.stack_1 = Stack()         self.stack_2 = Stack()     def enqueue(self, data):         self.stack_1.push(data)     def dequeue(self):         if self.stack_2.isempty():             while not self.stack_1.isempty():                 self.stack_2.push(self.stack_1.pop())         return self.stack_2.pop()

[時空復雜度] 入隊時間復雜度為 O(1),如果棧 stack_2 不為空,那么出隊的時間復雜度為 O(1),如果棧 stack_2 為空,則需要將元素從 stack_1 轉移到 stack_2,但由于 stack_2 中轉移的元素數量和出隊的元素數量是相等的,因此出隊的攤銷時間復雜度為 O(1)

2. 使用兩個隊列實現一個棧

[問題] 給定兩個隊列,僅使用隊列的基本操作實現一個棧。

[思路] 由于隊列并不具備反轉順序的特性,入隊順序即為元素的出隊順序。因此想要獲取最后一個入隊的元素,需要首先將之前所有元素出隊。因此為了使用兩個隊列實現棧,我們需要將其中一個隊列 store_queue 用于存儲元素,另一個隊列 temp_queue 則用來保存為了獲取最后一個元素而保存臨時出隊的元素。push 操作將給定元素入隊到存儲隊列 store_queue 中;pop 操作首先把存儲隊列 store_queue 中除最后一個元素外的所有元素都轉移到臨時隊列 temp_queue 中,然后存儲隊列 store_queue 中的最后一個元素出隊并返回。具體操作如下圖所示:

一起來分析Python隊列相關應用與習題

[算法]

?算法運行過程需要始終保持其中一個隊列為空,用作臨時隊列
?入棧 push:在非空隊列中插入元素 data
???若隊列 queue_1 為空:
?????將 data 插入 隊列 queue_2
???否則:
?????將 data 插入 隊列 queue_1
?出棧 pop:將隊列中的前n?1 個元素插入另一隊列,刪除并返回最后一個元素
???若隊列 queue_1 不為空:
?????將隊列 queue_1 的前n?1 個元素插入 queue_2,然后 queue_1 的最后一個元素出隊并返回
???若隊列 queue_2 不為空:
?????將隊列 queue_2 的前 n?1 個元素插入 queue_1,然后 queue_2 的最后一個元素出隊并返回

[代碼]

class Stack:     def __init__(self):         self.queue_1 = Queue()         self.queue_2 = Queue()     def isempty(self):         return self.queue_1.isempty() and self.queue_2.isempty()     def push(self, data):         if self.queue_2.isempty():             self.queue_1.enqueue(data)         else:             self.queue_2.enqueue(data)     def pop(self):         if self.isempty():             raise IndexError("Stack is empty")         elif self.queue_2.isempty():             while not self.queue_1.isempty():                 p = self.queue_1.dequeue()                 if self.queue_1.isempty():                     return p                 self.queue_2.enqueue(p)         else:             while not self.queue_2.isempty():                 p = self.queue_2.dequeue()                 if self.queue_2.isempty():                     return p                 self.queue_1.enqueue(p)

[時空復雜度] push 操作的時間復雜度為O(1),由于 pop 操作時,都需要將所有元素從一個隊列轉移到另一隊列,因此時間復雜度O(n)

3. 棧中元素連續性判斷

[問題] 給定一棧 stack1,棧中元素均為整數,判斷棧中每對連續的數字是否為連續整數(如果棧有奇數個元素,則排除棧頂元素)。例如,輸入棧 [1, 2, 5, 6, -5, -4, 11, 10, 55],輸入為 True,因為排除棧頂元素 55 后,(1, 2)(5, 6)(-5, -4)(11, 10) 均為連續整數。

[思路] 由于棧中可能存在奇數個元素,因此為了正確判斷,首次需要將棧中元素反轉,棧頂元素變為棧底,然后依次出棧,進行判斷。

[算法]

?棧 stack 中所有元素依次出棧,并插入隊列 queue
?隊列 queue 中所有元素出隊,并入棧 stack
? while 棧 stack 不為空:
???棧頂元素 e1 出棧,并插入隊列 queue
???如果棧 stack 不為空:
?????棧頂元素 e2 出棧,并插入隊列 queue
?????如果 |e1-e2|!=1
???????返回 False,跳出循環
?隊列 queue 中所有元素出隊,并入棧 stack

[代碼]

def check_stack_pair(stack):     queue = Queue()     flag = True     # 反轉棧中元素     while not stack.isempty():         queue.enqueue(stack.pop())     while not queue.isempty():         stack.push(queue.dequeue())     while not stack.isempty():         e1 = stack.pop()         queue.enqueue(e1)         if not stack.isempty():             e2 = stack.pop()             queue.enqueue(e2)             if abs(e1-e2) != 1:                 flag = False                 break     while not queue.isempty():         stack.push(queue.dequeue())     return flag

[時空復雜度] 時間復雜度為 O(n),空間復雜度為 O(n)

4. 重新排列隊列中元素順序

[問題] 給定一個整數隊列 queue,將隊列的前半部分與隊列的后半部分交錯來重新排列元素。例如輸入隊列為 [1, 2, 3, 4, 5, 6, 7, 8, 9],則輸出應為 [1, 6, 2, 7, 3, 8, 4, 9, 5]

[思路] 通過獲取隊列的前半部分,然后利用棧的反轉特性,可以實現重排操作,如下圖所示:

一起來分析Python隊列相關應用與習題

[算法]

?如果隊列 queue 中的元素數為偶數:
???half=queue.size//2
?否則:
???half=queue.size//2+1
?1. 將隊列 queue 的前半部分元素依次出隊并入棧 stack
?2. 棧 stack 中元素出棧并入隊 queue
?3. 將隊列 queue 中在步驟 1中未出隊的另一部分元素依次出隊并插入隊尾
?4. 將隊列 queue 的前半部分元素依次出隊并入棧 stack
?5. 將棧 stack 和隊列 queue 中的元素交替彈出并入隊
?6. 如果棧 stack 非空:
???棧 stack 中元素出棧并入隊

[代碼]

def queue_order(queue):     stack = Stack()     size = queue.size    if size % 2 == 0:         half = queue.size//2     else:         half = queue.size//2 + 1     res = queue.size - half    for i in range(half):         stack.push(queue.dequeue())     while not stack.isempty():         queue.enqueue(stack.pop())     for i in range(res):         queue.enqueue(queue.dequeue())     for i in range(half):         stack.push(queue.dequeue())     for i in range(res):         queue.enqueue(stack.pop())         queue.enqueue(queue.dequeue())     if not stack.isempty():         queue.enqueue(stack.pop())

[時空復雜度] 時間復雜度為O(n),空間復雜度為 O(n)

5. 反轉隊列中前 m 個元素的順序

[問題] 給定一個整數 m 和一個整數隊列 queue,反轉隊列中前 k 個元素的順序,而其他元素保持不變。如 m=5,隊列為 [1, 2, 3, 4, 5, 6, 7, 8, 9],算法輸出為 [5, 4, 3, 2, 1, 6, 7, 8, 9]

[思路] 結合 [問題4] 我們可以發現,此題就是 [問題4] 的前 3 步,如下圖所示:

一起來分析Python隊列相關應用與習題

[算法]

?1. 將隊列 queue 的前 m 個元素依次出隊并入棧 stack
?2. 棧 stack 中元素出棧并入隊 queue
?3. 將隊列 queue 中在步驟 1中未出隊的另一部分元素依次出隊并插入隊尾

[代碼]

def reverse_m_element(queue, m):     stack = Stack()     size = queue.size    if queue.isempty() or m>size:         return     for i in range(m):         stack.push(queue.dequeue())     while not stack.isempty():         queue.enqueue(stack.pop())     for i in range(size-m):         queue.enqueue(queue.dequeue())

[時空復雜度] 時間復雜度為O(n),空間復雜度為 O(n)

推薦學習:python教程

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
欧美不卡在线播放| 中文字幕av不卡在线| 亚洲欧美一区二区三区不卡| 蜜臀av午夜一区二区三区| 久久国产成人精品国产成人亚洲| 国产精品久久久久9999爆乳| 国产精品无码电影在线观看| 青青草视频国产| 欧美这里只有精品| 黄色一级片黄色| 国产老熟妇精品观看| 成人小视频在线看| 在线观看av网页| 欧美xxxxxbbbbb| 国产精品av免费观看| 草b视频在线观看| 免费看一级大黄情大片| 日日摸天天爽天天爽视频| 麻豆传传媒久久久爱| 国产三级国产精品国产专区50| 网站在线你懂的| 国产高清不卡无码视频| 欧美日韩亚洲第一| 亚洲美女性囗交| 日本一本中文字幕| 久久久精品在线视频| 亚洲精品免费一区亚洲精品免费精品一区 | 日韩欧美精品在线观看视频| aaa毛片在线观看| 超碰在线免费观看97| 成人毛片视频网站| 国产一级片自拍| 免费国产黄色网址| 在线免费观看av网| 国产亚洲综合视频| 色香蕉在线观看| 日本在线观看a| 日本在线视频www色| 精品免费国产一区二区| 免费的一级黄色片| 日本美女视频一区| 日本三级免费网站| 国产 国语对白 露脸| 91精品无人成人www| 国产亚洲欧美在线视频| 波多野结衣激情| 69久久久久久| 亚洲国产精品久久久久爰色欲| 两性午夜免费视频| 91激情视频在线| 伊人成色综合网| 久久久久久久久久久综合| 91小视频网站| 男人女人黄一级| 青青青国产在线观看| 干日本少妇视频| 国内自拍第二页| 奇米视频7777| 17c国产在线| www.五月天色| 天天av天天操| 国产农村妇女精品久久| 亚洲欧美aaa| 亚洲综合20p| 韩国黄色一级大片| 色撸撸在线观看| 欧美少妇在线观看| 欧美精品久久96人妻无码| 永久免费在线看片视频| 黄色免费高清视频| 日本成人在线不卡| 欧美亚洲黄色片| 免费成人在线视频网站| 97国产在线播放| av网址在线观看免费| 超碰在线97免费| 精品综合久久久久| 久久久成人精品一区二区三区| 日本黄色播放器| 免费看毛片的网址| 色诱视频在线观看| 夜夜夜夜夜夜操| av不卡在线免费观看| av动漫在线播放| 免费一级特黄特色毛片久久看| 日av中文字幕| 最新免费av网址| 成人免费视频91| 日韩欧美xxxx| 麻豆md0077饥渴少妇| 成人免费观看cn| 不卡中文字幕在线观看| 国产高清不卡无码视频| 日本一极黄色片| 国产制服91一区二区三区制服| 青青青免费在线| 午夜国产福利在线观看| 全黄性性激高免费视频| 亚洲综合欧美在线| 人人妻人人澡人人爽欧美一区| 一女被多男玩喷潮视频| 在线观看日本www| 国产超级av在线| 男人j进女人j| 久久国产精品国产精品| 日韩xxxx视频| 亚洲综合在线一区二区| 无码人妻丰满熟妇区毛片18| 欧美一级特黄aaaaaa在线看片| 无码人妻丰满熟妇区毛片| 4444亚洲人成无码网在线观看| 日韩精品你懂的| 欧美啪啪免费视频| 在线观看污视频| 99中文字幕在线| 亚洲欧美另类动漫| 六月丁香激情网| 日韩亚洲欧美一区二区| 午夜视频在线网站| 日日躁夜夜躁aaaabbbb| 欧美激情视频免费看| 樱空桃在线播放| 怡红院亚洲色图| 中文字幕无码不卡免费视频| 欧美激情视频免费看| 成人免费a级片| 成人毛片100部免费看| 婷婷激情小说网| 久久久久久久高清| 中文字幕66页| 日韩视频在线观看一区二区三区| 免费男同深夜夜行网站 | 9久久9毛片又大又硬又粗| 欧美黄色免费网址| 999一区二区三区| 日韩一级性生活片| 九一国产精品视频| 欧美视频免费看欧美视频| 可以看毛片的网址| 国产欧美日韩网站| av天堂永久资源网| 色诱视频在线观看| 国产无遮挡猛进猛出免费软件 | 任你操这里只有精品| 欧美少妇性生活视频| www.com操| 在线播放 亚洲| 人妻夜夜添夜夜无码av| 国产一区二区在线视频播放| av网站在线观看不卡| 欧美激情第3页| 成年人深夜视频| 99999精品视频| www.色欧美| 9色porny| 国产精品人人爽人人爽| 一本之道在线视频| 久久免费视频3| 红桃视频 国产| 欧美精品久久久久久久久久久| 男人的天堂99| 婷婷视频在线播放| 国产精品丝袜久久久久久消防器材| 爱情岛论坛成人| 免费的av在线| 污版视频在线观看| 免费看毛片的网址| 亚洲高清视频免费| a在线视频观看| 污污的视频免费观看| 国产黄视频在线| 国产性生活一级片| 国产91在线视频观看| 免费看污污视频| 制服丝袜综合网| 99福利在线观看| 精品久久久久久无码中文野结衣| www午夜视频| avav在线看| 日韩五码在线观看| 乱子伦一区二区| 亚洲无在线观看| 欧美三级理论片| 国产aaa一级片| 欧美亚洲精品一区二区| 免费观看中文字幕| 日本不卡一区在线| 亚洲色精品三区二区一区| 激情伊人五月天| 日韩视频在线视频| 国产尤物av一区二区三区| 亚洲欧美日韩一二三区| 超碰超碰在线观看| 91国产精品视频在线观看| 亚洲欧洲日产国码无码久久99| 日韩 欧美 视频| 亚洲人精品午夜射精日韩| 久久久久久久久影视| 麻豆md0077饥渴少妇| 51xx午夜影福利|