佇列與棧的型別很相似,但它遵循的原則是先進先出(fifo),也就是元素插入的時候只能在該資料結構的末端,而刪除只能刪除最前面的元素。佇列同樣應用廣泛,例如印表機的佇列或者是乙個web伺服器響應請求。
作為乙個佇列,同樣要滿足一下幾個方法:
首先佇列與棧的結構很相似,棧使用的是基於列表的方式實現的,那麼佇列也同樣如此。
對於這種問題,我們首先想到在每次出隊的時候將列表中的每乙個元素都向前移動一位,使列表的第乙個元素永遠是佇列的首個元素,但是這樣每次的出隊都會移動所有的佇列中的元素,代價太大,不可取。
這裡先列出實現的具體**:
classempty(exception):passclassqueue():
"""基於迴圈列表的佇列
"""default_capacity = 10def__init__(self):
self._data = [none] * queue.default_capacity
self._size = 0
self._front = 0def__len__(self):returnself._sizedefis_empty(self):returnself._size == 0deffirst(self):ifself.is_empty():raiseempty('queue is empty')returnself._data[self._front]defdequeue(self):ifself.is_empty():raiseempty('queue is empty')
temp = self._data[self._front]
self._front = (self._front + 1) % len(self._data)
self._size -= 1returntempdefenqueue(self, e):ifself._size == len(self._data):
self._resize(2 * len(self._data))
temp = (self._front + self._size) % len(self._data)
self._data[temp] = e
self._size += 1def_resize(self, cap):
"""預設cap是大於原佇列長度的
"""old = self._data
self._data = [none] * cap
front = self._frontforiinrange(self._size):
self._data[i] = old[front]
front = (1 + front) % len(old)
self._front = 0
**中的_data為儲存資料的列表,_size為佇列的長度,_front為佇列首位置的索引。**認真讀一下還是非常容易理解的,主要利用了%求餘的方式來判斷佇列的頭部或者要插入元素的位置。其中的_resize方法可以改變佇列的長度,並且將佇列的首部放到了列表的首位置。
雙端佇列其實已經不屬於佇列了,它既可以從左進從右出,也可以從右進從左出,這種靈活性其實使它使用的更加廣泛。其實他只是在佇列的基礎上又做了一些增加與修改:
雙端佇列擁有的基本的方法有:
其中的add_last()與佇列中的enqueue()相同,delete_first()與dequeue()相同,與之不同的是多了add_first()與delete_last()
defadd_first(self, e):ifself._size == len(self._data):
self._resize(2 * len(self._data))
temp = (self._front - 1) % len(self._data)
self._data[temp] = e
self._front = temp
self._size += 1defdelete_last(self):ifself.is_empty():raiseempty('queue is empty')
temp = self._data[(self._front + self._size - 1) % len(self._data)]
self._size -= 1returntemp
如果要使用雙端佇列,其實python標準庫已經有現成的雙端佇列類供使用了,就是collections模組中的deque類。
deque類的常用方法有:
參考《資料結構與演算法python語言實現》
python實現資料結構(五) 佇列實現
佇列 queue 是只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。佇列是一種先進先出的 first in first out 的線性表,簡稱fifo。允許插入的一端為隊尾,允許刪除的一端為隊頭。佇列不允許在中間部位進行操作!假設佇列是q a1,a2,an 那麼a1就是隊頭元素,而an是隊...
用Python學習資料結構1 佇列
佇列是一種特殊的線性表,特殊之處在意它只允許在表的前端 front 隊頭 進行刪除操作,而在表的後端 隊尾 進行操作。即 先進先出 coding utf 8 spyder editor this is script file for queue.class queue def init self,s...
python 實現資料結構 lesson 2 佇列
佇列 queue 是較為容易理解的概念,就像買票排隊一樣,先進先出,新來的人排到隊尾,最早到的人最先出列。如下 coding utf 8 classqueue object def init self size self.size size self.queue defget size self r...