久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      一起來分析Python隊列相關(guān)應(yīng)用與習(xí)題

      本篇文章給大家?guī)砹岁P(guān)于python的相關(guān)知識,其中主要介紹了隊列相關(guān)的應(yīng)用于習(xí)題,包括了怎么使用兩個棧來實現(xiàn)一個隊列,怎么使用兩個隊列實現(xiàn)一個棧,棧中元素連續(xù)性判斷等等,希望對大家有幫助。

      一起來分析Python隊列相關(guān)應(yīng)用與習(xí)題

      推薦學(xué)習(xí):python教程

      0. 學(xué)習(xí)目標(biāo)

      我們已經(jīng)學(xué)習(xí)了隊列的相關(guān)概念以及其實現(xiàn),同時也了解了隊列在實際問題中的廣泛應(yīng)用,本節(jié)的主要目的是通過隊列的相關(guān)習(xí)題來進一步加深對隊列的理解,同時能夠利用隊列降低一些復(fù)雜問題解決方案的時間復(fù)雜度。

      1. 使用兩個棧實現(xiàn)一個隊列

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

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

      一起來分析Python隊列相關(guān)應(yīng)用與習(xí)題

      [算法]

      ?入隊 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()

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

      2. 使用兩個隊列實現(xiàn)一個棧

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

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

      一起來分析Python隊列相關(guān)應(yīng)用與習(xí)題

      [算法]

      ?算法運行過程需要始終保持其中一個隊列為空,用作臨時隊列
      ?入棧 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)

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

      3. 棧中元素連續(xù)性判斷

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

      [思路] 由于棧中可能存在奇數(shù)個元素,因此為了正確判斷,首次需要將棧中元素反轉(zhuǎn),棧頂元素變?yōu)闂5祝缓笠来纬鰲?,進行判斷。

      [算法]

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

      [代碼]

      def check_stack_pair(stack):     queue = Queue()     flag = True     # 反轉(zhuǎn)棧中元素     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

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

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

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

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

      一起來分析Python隊列相關(guān)應(yīng)用與習(xí)題

      [算法]

      ?如果隊列 queue 中的元素數(shù)為偶數(shù):
      ???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())

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

      5. 反轉(zhuǎn)隊列中前 m 個元素的順序

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

      [思路] 結(jié)合 [問題4] 我們可以發(fā)現(xiàn),此題就是 [問題4] 的前 3 步,如下圖所示:

      一起來分析Python隊列相關(guān)應(yīng)用與習(xí)題

      [算法]

      ?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())

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

      推薦學(xué)習(xí):python教程

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號