1. 程式人生 > >Python資料結構——佇列(queue)

Python資料結構——佇列(queue)

先入隊的元素先出隊,即先進先出(first in first out,FIFO)。

在python中同樣可以使用列表,來構建一個佇列。

# -*- coding:utf-8 -*-
# file: pyqueue.py
#
class PyQueue:										# 建立佇列
	def __init__(self, size = 20):
		self.queue = []								# 佇列
		self.size = size							# 佇列大小
		self.end = -1								# 隊尾
	def setSize(self, size):						# 設定佇列大小
		self.size = size
	def In(self, element):							# 入隊
		if self.end < self.size - 1:
			self.queue.append(element)
			self.end = self.end + 1
		else:
			raise QueueException('PyQueueFull')	# 如果佇列滿則引發異常
	def Out(self):									# 出隊
		if self.end != -1:
			element = self.queue[0]
			self.queue = self.queue[1:]
			self.end = self.end - 1
			return element
		else:
			raise QueueException('PyQueueEmpty')	# 如果對列為空則引發異常
	def End(self):									# 輸出隊尾
		return self.end
	def empty(self):								# 清除佇列
		self.queue = []
		self.end = -1

class QueueException(Exception):					#自定義異常類
	def __init__(self,data):
		self.data=data
	def __str__(self):
		return self.data
	
if __name__ == '__main__':
	queue = PyQueue()
	for i in range(10):
		queue.In(i)									# 元素入隊
	print(queue.End())
	for i in range(10):
		print(queue.Out())							# 元素出隊
	for i in range(20):
		queue.In(i)									# 元素入隊
	queue.empty()									# 清空佇列
	for i in range(20):
		print(queue.Out())							# 此處將引發異常

 

執行結果如下:

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> 
== RESTART: G:\中南碩士生涯\(全部)Python學習\《python資料分析從入門到精通》張嘯宇\原始碼\第5章\pyqueue.py ==
9
0
1
2
3
4
5
6
7
8
9
Traceback (most recent call last):
** IDLE Internal Exception: 
  File "C:\Users\lenovo\AppData\Local\Programs\Python\Python36\lib\idlelib\run.py", line 460, in runcode
    exec(code, self.locals)
  File "G:\pyqueue.py", line 48, in <module>
    print(queue.Out())							# 此處將引發異常
  File "G:\pyqueue.py", line 24, in Out
    raise QueueException('PyQueueEmpty')	# 如果對列為空則引發異常
QueueException: PyQueueEmpty