Python與數據結構[2] -> 隊列/Queue[0] -> 數組隊列的 Python 實現
阿新 • • 發佈:2018-01-15
return 閱讀 位置 pri end 實現 http family 隊列實現
隊列 / Queue
數組隊列
數組隊列是隊列基於數組的一種實現,其實現類似於數組棧,是一種FIFO的線性數據結構。
Queue:
<--| 1 | 2 | 3 | 4 | 5 |<--
下面將使用Python中的list來替代C語言中的數組實現數組隊列的數據結構。
Note: 這裏的實現並沒有像C語言中的申請一塊固定大小的數組,手動的定制數組中隊列的頭尾位置,而是利用list的特性直接完成,因此較為簡單。
數組隊列的實現與數組棧的實現基本類似,同時入列和出列也十分簡單,僅需要對數組進行操作即可。
這裏直接給出完整代碼和運行結果,實現過程可參考數組棧的實現。
後續再補充固定數組大小的隊列實現。
完整代碼
1 class QueueEmptyException(Exception): pass 2 3 4 class QueueFullException(Exception): pass 5 6 7 class Queue: 8 """ 9 Queue: 10 <--| 1 | 2 | 3 | 4 | 5 |<-- 11 """ 12 def __init__(self, max=0): 13 self.queue = []14 self._max = max 15 self.max = max 16 17 def __str__(self): 18 return ‘ | ‘.join(map(str, self.queue)) 19 20 def init(self, iterable=()): 21 if not iterable: 22 return 23 self.queue.extend(list(iterable)) 24 25 @property26 def max(self): 27 return self._max 28 29 @max.setter 30 def max(self, m): 31 m = int(m) 32 if m < self.length: 33 raise Exception(‘Resize queue failed, please dequeue some elements first.‘) 34 self._max = m 35 if self._max < 0: 36 self._max = 0 37 38 def show(self): 39 print(self) 40 41 @property 42 def length(self): 43 return len(self.queue) 44 45 @property 46 def is_empty(self): 47 return not bool(self.queue) 48 49 @property 50 def is_full(self): 51 return bool(self._max and self.length == self._max) 52 53 def enqueue(self, item): 54 if self.is_full: 55 raise QueueFullException(‘Error: trying to enqueue element into a full queue‘) 56 self.queue.append(item) 57 58 def dequeue(self): 59 if self.is_empty: 60 raise QueueEmptyException(‘Error: trying to dequeue element from an empty queue‘) 61 front = self.queue[0] 62 self.queue = self.queue[1:] 63 return front 64 65 def clear(self): 66 self.queue = [] 67 68 69 def test(queue): 70 print(‘\nInit queue:‘) 71 queue.init([1, 2, 3, 4, 5, 6, 7]) 72 queue.show() 73 74 print(‘\nEnqueue element to queue:‘) 75 queue.enqueue(‘like‘) 76 queue.show() 77 78 print(‘\nDequeue element from queue:‘) 79 e = queue.dequeue() 80 print(‘Element %s deququed,‘ % e) 81 queue.show() 82 83 print(‘\nSet queue max size:‘) 84 try: 85 queue.max = 1 86 except Exception as e: 87 print(e) 88 89 print(‘\nSet queue max size:‘) 90 queue.max = 7 91 print(queue.max) 92 93 print(‘\nEnqueue full queue:‘) 94 try: 95 queue.enqueue(7) 96 except QueueFullException as e: 97 print(e) 98 99 print(‘\nClear queue:‘) 100 queue.clear() 101 queue.show() 102 103 print(‘\nQueue is empty:‘) 104 print(queue.is_empty) 105 106 print(‘\nDequeue empty queue:‘) 107 try: 108 queue.dequeue() 109 except QueueEmptyException as e: 110 print(e) 111 112 if __name__ == ‘__main__‘: 113 test(Queue())
運行得到結果
Init queue: 1 | 2 | 3 | 4 | 5 | 6 | 7 Enqueue element to queue: 1 | 2 | 3 | 4 | 5 | 6 | 7 | like Dequeue element from queue: Element 1 deququed, 2 | 3 | 4 | 5 | 6 | 7 | like Set queue max size: Resize queue failed, please dequeue some elements first. Set queue max size: 7 Enqueue full queue: Error: trying to enqueue element into a full queue Clear queue: Queue is empty: True Dequeue empty queue: Error: trying to dequeue element from an empty queue
相關閱讀
1 數組棧
Python與數據結構[2] -> 隊列/Queue[0] -> 數組隊列的 Python 實現