資料結構--3.4佇列
阿新 • • 發佈:2018-12-01
基本操作:
入隊(enqueue):隊尾rear插入
出隊(dequeue):隊首front刪除
實現方式
連結串列實現:繼承自連結串列結構(本文略)
陣列實現:迴圈陣列,只要Rear或者Front達到陣列的尾端,他就繞回到開頭。
#include <iostream> using namespace std; typedef struct QueueRecord { int m_capacity; int m_rear; int m_front; int m_size; int* m_arry; }*Queue; Queue CreatQueue(int capacity); void Enqueue(Queue q, int x); void Dequeue(Queue q); bool IsFull(Queue q); bool IsEmpty(Queue q); void Traverse(Queue q);//隊首到隊尾遍歷 bool IsMakeEmpty(Queue q); int main() { Queue q = CreatQueue(5); Enqueue(q, 1); Enqueue(q, 2); Enqueue(q, 3); Traverse(q); cout << "出隊一次:" << endl; Dequeue(q); Traverse(q); cout << "將4入隊:" << endl; Enqueue(q, 4); Traverse(q); if (IsMakeEmpty(q)) cout << "置空成功" << endl; Traverse(q); system("pause"); return 0; } Queue CreatQueue(int capacity) { Queue q = new QueueRecord; q->m_capacity = capacity; q->m_rear = -1; q->m_front = -1; q->m_size = 0; q->m_arry = new int[capacity]; return q; } void Enqueue(Queue q, int x) { if (!IsFull(q)) { q->m_size++; q->m_rear++; q->m_arry[q->m_rear] = x; } else cout << "佇列已滿,無法入隊" << endl; } void Dequeue(Queue q) { if (!IsEmpty(q)) { q->m_size--; q->m_front++; q->m_rear--; } else cout << "佇列以空,無法出隊" << endl; } bool IsFull(Queue q) { if (q->m_size == q->m_capacity) return true; return false; } bool IsEmpty(Queue q) { if (q->m_size == 0) return true; return false; } void Traverse(Queue q) { cout << "隊首到隊尾遍歷:" << endl; if (!IsEmpty(q)) { int tmp = q->m_size; int i = 0; while (i < tmp) { cout << q->m_arry[i] << " "; i++; } cout << endl; } else cout << "佇列為空" << endl; } bool IsMakeEmpty(Queue q) { if (q != nullptr) { q->m_size = 0; q->m_front = -1; q->m_rear = -1; return true; } else cout << "不佔空間的空棧" << endl; }
應用:
1、作業送交給印表機;但是印表機可以刪除中間的佇列,違反了佇列的嚴格定義
但是,放到佇列未必最好,有時希望花費時間最長的作業放到最後,此時可以使用堆(優先佇列)。
2、PC機的網路設定,磁碟是放在一臺叫做檔案伺服器的機器上,使用者是根據先到先使用的原則訪問檔案,其資料結構為佇列
3、接線員對大公司的傳呼
4、在終端上的等待也是佇列
拓展
排隊論:處理這樣一類問題,用概率的方法計算使用者排隊預計等待時間,以及整個佇列能夠容納的處理時間。
答案依賴於使用者加入佇列的概率,以及加入佇列後處理服務花費的時間,這兩個引數作為概率分佈函式給出。