資料結構和演算法 佇列

2021-09-14 01:44:44 字數 4122 閱讀 9043

佇列

通俗點的定義就是,排隊買票,先到的先買。就是先進先出。佇列和棧一樣都是操作受限的線性表資料結構

在隊尾入隊,隊頭出隊。同樣想象買票的流程。除非你經常插隊要不很容易理解!

順序佇列:用陣列實現的佇列

鏈式佇列:用鍊錶實現的佇列

1、順序佇列的python**實現

首先說一下順序佇列的實現過程。與棧只需要乙個棧頂指標不同,佇列需要兩個指標乙個指向隊頭,乙個指向隊尾。

在入隊和出隊操作之後,指標的位置就會後移,因陣列的長度限制,當隊尾指向陣列尾部下標的時候無法後移。如果出隊一次進行一次資料遷移就不會有這種問題,但是時間複雜度就會由o1)變為o(n)。所以解決辦法就是當沒有空閒時間之後,才進行一次大的資料遷移。

如圖:紅色為隊頭藍色為隊尾。如果每操作一次出隊,就進行一次資料遷移,那麼時間複雜度就會變為o(n),如果無法插入時再進行資料前移,那麼出隊的時間複雜度仍然是o(1)。入隊的時間複雜度就會由o(1),變為n-1o(1)加上一次o(n)。均攤時間複雜度就是o(1).

python沒有陣列,有列表,列表是由對其它物件的引用組成的連續陣列。指向這個陣列的指標及其長度被儲存在乙個列表頭結構中。這就意味著每次進行增刪操作都需要對陣列的大小進行重新分配。這樣的結構在對列表進行操作時的時間複雜度會很高。為了避免這種情況,這裡要引入分配槽的概念,分配槽的大小不等同於列表大小,分配槽大小是指在記憶體中已經分配了的槽空間數。這樣能避免每次列表新增資料都呼叫分配函式,這樣均攤的時間複雜度就會比較低。增長模式為:04816253546587288……。所以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 的運算。沒有了位置概念,保證任何時候可以訪問 刪除的元素都是此前最後存入的那個元素,確定了一種預設...

資料結構與演算法 佇列

學習了好長 一段時間的資料結構,由於時間關係一直沒有寫部落格。這次打算將這段時間的學習內容寫下來做個整理。佇列作為線性結構的一種,其實用性不用多說。這裡總結下兩種結構的佇列實現。迴圈佇列 先列下以順序表結構形成的普通順序佇列存在的問題 隊頭不斷刪除元素,將使佇列的頭部空出單元 隨著刪除 插入的進行,...