佇列
通俗點的定義就是,排隊買票,先到的先買。就是先進先出。佇列和棧一樣都是操作受限的線性表資料結構
在隊尾入隊,隊頭出隊。同樣想象買票的流程。除非你經常插隊要不很容易理解!
順序佇列:用陣列實現的佇列
鏈式佇列:用鍊錶實現的佇列
1、順序佇列的python**實現
首先說一下順序佇列的實現過程。與棧只需要乙個棧頂指標不同,佇列需要兩個指標乙個指向隊頭,乙個指向隊尾。
在入隊和出隊操作之後,指標的位置就會後移,因陣列的長度限制,當隊尾指向陣列尾部下標的時候無法後移。如果出隊一次進行一次資料遷移就不會有這種問題,但是時間複雜度就會由o(1)變為o(n)。所以解決辦法就是當沒有空閒時間之後,才進行一次大的資料遷移。
如圖:紅色為隊頭藍色為隊尾。如果每操作一次出隊,就進行一次資料遷移,那麼時間複雜度就會變為o(n),如果無法插入時再進行資料前移,那麼出隊的時間複雜度仍然是o(1)。入隊的時間複雜度就會由o(1),變為n-1次o(1)加上一次o(n)。均攤時間複雜度就是o(1).
python沒有陣列,有列表,列表是由對其它物件的引用組成的連續陣列。指向這個陣列的指標及其長度被儲存在乙個列表頭結構中。這就意味著每次進行增刪操作都需要對陣列的大小進行重新分配。這樣的結構在對列表進行操作時的時間複雜度會很高。為了避免這種情況,這裡要引入分配槽的概念,分配槽的大小不等同於列表大小,分配槽大小是指在記憶體中已經分配了的槽空間數。這樣能避免每次列表新增資料都呼叫分配函式,這樣均攤的時間複雜度就會比較低。增長模式為:0,4,8,16,25,35,46,58,72,88……。所以python實現佇列並對佇列進行操作時,與正常陣列實現的佇列不大一樣(因為我的開發語言是python所以有時會對python一些特性進行分析)
因python列表的特性,進行刪除操作時的時間複雜度為o(n).所以在進行出隊時不要進行刪除操作。留到資料遷移時同時進行
順序佇列
class queues:
def __init__(self):
self.items =
self._len = none
self._head = 0
self._taile = 0
def _pop(self):
if self.items:
re_data = self.items[self._head]
self._head = self._head + 1
if self._head == 10:
self._kuorong()
return re_data
else:
return none
def _push(self,data):
self._taile = self._taile + 1
def _kuorong(self):
self.items = self.items[self._head:self._taile]
self._head = 0
self._taile = len(self.items)
2.鏈式佇列
class node(object):
def __init__(self,data,next=none):
self.data = data
self.next = next
class equeue:
def __init__(self):
self.headnode = node(none)
self.rear = none
def _push(self,data):
newnode = node(data)
if not self.rear:
self.headnode.next = newnode
self.rear = newnode
else:
self.rear.next = newnode
self.rear = newnode
def _pop(self):
result = self.headnode.next
if self.headnode.next:
self.headnode.next = self.headnode.next.next
else:
return none
return result.data
3.迴圈佇列
class queues:
def __init__(self):
self.items = [none]*10
self._len = none
self._head = 0
self._taile = 0
def _pop(self):
if self.items[self._head] != none:
print(self.items[self._head])
re_data = self.items[self._head]
self.items[self._head] = none
self._head = self._head + 1
if self._head == 10:
self._head = 0
return re_data
return none
def _push(self,data):
#print(self._taile,self.items[self._taile])
if self.items[self._taile] == none:
self.items[self._taile] = data
self._taile = self._taile + 1
if self._taile == 10:
self._taile = 0
else:
#print("隊滿")
pass
萬分感謝馬老師和王爭大佬的知識分享!
資料結構與演算法 棧和佇列
棧 是限制在表的一端進行插入和刪除運算的線性表。棧又稱後進先出簡稱lifo表 佇列 也是一種運算受限的線性表。它只允許在標的一端進行插入,而在另一端進行刪除。佇列亦稱先進先出fifo表 1.棧與佇列的區別 1 佇列先進先出,棧先進後出。2 對插入和刪除操作的 限定 棧是限定只能在表的一端進行插入和刪...
資料結構與演算法 棧和佇列
棧 stack 有些地方稱為堆疊,是一種容器,可存入資料元素 訪問元素 刪除元素,它的特點在於只能允許在容器的一端 稱為棧頂端指標,英語 top 進行加入資料 英語 push 和輸出資料 英語 pop 的運算。沒有了位置概念,保證任何時候可以訪問 刪除的元素都是此前最後存入的那個元素,確定了一種預設...
資料結構與演算法 佇列
學習了好長 一段時間的資料結構,由於時間關係一直沒有寫部落格。這次打算將這段時間的學習內容寫下來做個整理。佇列作為線性結構的一種,其實用性不用多說。這裡總結下兩種結構的佇列實現。迴圈佇列 先列下以順序表結構形成的普通順序佇列存在的問題 隊頭不斷刪除元素,將使佇列的頭部空出單元 隨著刪除 插入的進行,...