通過佇列實現排隊 呆萌資料結構 04佇列

2021-10-11 15:55:12 字數 2828 閱讀 9391

呆萌資料結構(04) | 佇列​imoegirl.com

生活中的一些排隊行為,基本上都是佇列的形式。這篇部落格涉及的概念有佇列迴圈佇列優先佇列雙端佇列

很多程式語言已經內建了佇列結構,在實際專案中可以直接使用。這篇文章裡的**實現,主要用做原理理解。

拿超市買單為例,買完東西,一般會找乙個結賬臺排隊,等待結賬。如果前面已經有人在排隊,那你肯定是排在當前隊伍的最後面,如果再來人,肯定是排在你的後面,依次往後排。每當有乙個顧客買完單,那後面的顧客就會往前走,直到整個買單隊伍沒有人排隊。這就是佇列結構。是不是很簡單~

佇列,是一種先進先出的結構(first in first out),也就是在隊尾進行插入操作,在隊頭進行刪除操作。佇列可以用鍊錶來實現,也可以用陣列來實現,要根據實際需求來決定。

佇列的操作有入列出列判斷是否為空判斷是否已滿等操作。下面將用c#來實現列表結構,看**

public class node

}public class linkedlistqueue

else

}// 刪除乙個元素

public int dequeue()

node node = head;

head = head.next;

return node.data;

}// 判斷是否為空

public bool isempty()

}

迴圈佇列,是將佇列的空間,想象成首尾相接的圓環形式。這樣可以充分利用佇列空間,並且防止偽溢位的發生。迴圈佇列,使用索引對容量取模計算出當前要插入元素的索引。

迴圈佇列有兩個索引,乙個指向隊頭,乙個隊尾,當隊頭索引等於隊尾所引時,隊列為空。而判斷隊滿,有兩種方式,一種是加乙個變數,用於記錄元素數量。一種是空乙個位置,使用乙個簡單計算來判斷是佇列是否已滿。這裡我們使用第二種方式。看下面的**。

public class circularqueue

// 判斷佇列是否為空

public bool isempty()

// 判斷佇列是否已滿

public bool isfull()

// 入列乙個元素

public void enqueue(int data)

array[tail] = data;

tail = (tail + 1) % capacity;

debug.log("enqueue: " + data);

}// 出列乙個元素

public int dequeue()

int data = array[head];

head = (head + 1) % capacity;

return data;}}

為了使判斷隊列為空和佇列已滿不衝突,所以我們將佇列空了乙個位置,所以要記得整個佇列的實際容量為 capacity - 1
迴圈佇列裡最主要的計算就是取模計算,只要理清了這個,就很容易理解了,可以自己建立乙個小容量佇列,然後在紙上跟著**演算一遍,很容易理解。

迴圈佇列可以充分利用分配的記憶體,減少記憶體分配次數,提高程式效能。

如果買冰激凌時,允許插隊,那這就是乙個優先佇列。

優先佇列和普通的佇列基本一樣,只是在插入元素時會根據優先順序,將元素插入到正確的位置,而不是直接放到隊尾。例如在任務系統中使用優先佇列,就可以保證優先順序更高的任務排在前面,優先出列被處理。

優先佇列往往用來實現。這個後面才會學到,所以這裡暫時不做優先佇列的**實現,現在只要知道有這樣乙個東西就行。

雙端佇列從結構上已經和普通的佇列不太一樣了,它有兩個頭,左邊和右邊。可以從左邊入列,從左邊出列,也可以從右邊入列,從右邊出列。我們可以用雙向鍊錶實現這樣乙個結構。

public class doubleendedqueue

// 從左邊入列乙個元素

public void enqueueleft(int data)

else

}// 從左邊出列乙個元素

public int dequeueleft()

node node = left;

if(left.next != null)

left = left.next;

return node.data;

}// 從右邊入列乙個元素

public void enqueueright(int data)

else

}// 從右邊出列乙個元素

public int dequeueright()

node node = right;

if(right.prev != null)

right = right.prev;

return node.data;}}

雙端佇列大概就是這樣,不要著急,好好體會一下,很簡單。

資料結構習題 辦事大廳排隊(鏈式佇列實現)

在鄭州大學綜合辦事大廳,每天陸陸續續有很多人來排隊辦事。現在你能否寫程式幫助老師時刻了解當前辦理業務的情況。第一行乙個數字n,表示排隊資訊或者查詢資訊條目的數量。以下n行,每行的內容有以下3種情況 1 in name 表示名字為name的人員新來到辦事大廳,排在隊伍的最後。in和name間存在乙個空...

資料結構 Java實現佇列

佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端 head 進行刪除操作,而在表的後端 tail 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。佇列的資料元素又稱為佇列元素。在佇列中插入乙個佇列元素稱為入...

資料結構 佇列(Python實現)

佇列的操作及實現 先進先出 佇列操作 佇列內容 返回值is empty true insert 2 insert 5 insert 8 2,52,5,8 pop 5,82 size 5,82 順序佇列 1 初始化 def init self self.que 2 判斷是否為空 def is empt...