隊列示意圖:

隊頭(Front)離開
隊尾(Rear)進入
隊列(Queue)是僅能在表耳我進行插入操作,在表頭進行刪除操作的線性表。
表尾即 an 端,稱為隊尾;
表頭即 a1 端,稱為隊頭。
它是一種先進先出(FIFO)的線性表

插入元素稱為“入隊”;
刪除元素稱為“出隊”。
隊列的存儲結構為鏈隊或順序隊(常用循環順序隊)
隊列的相關概念:
① 定義:只能在標的一端進行插入運算,在表的另一端進行刪除運算的線性表(頭刪尾插)
② 邏輯結構:同線性表相同,仍為一對一關系
③ 存儲結構:順序隊或鏈隊,以循環順序隊列更常見
④ 運算規則:只能在隊首和隊尾運算,且訪問結點時依照先進先出(FIFO)的原則
⑤ 實現方式:關鍵是掌握入隊和出隊操作,具體實現依順序隊或鏈隊的不同而不同。
隊列常見應用:
① 脫機打印輸出:按申請的先后順序依次輸出
② 多用戶系統中,多個用戶排成隊,分時地循環使用 CPU 和 主存
③ 按用戶的優先級排成多個隊,每個優先級一個隊列
④ 實時控制系統中,信號按接收的先后順序依次處理
⑤ 網絡電文傳輸,按到達的時間先后順序依次進行
凡是在使用有限資源時,有多個想要使用此資源都需要排隊,而在排隊時都需要用到隊列。
隊列的抽象數據及類型定義:
① 數據對象:D = {ai | ai ∈ ElemSet, i = 1,2,3,4....,n, n ≥ 0}
② 數據關系:R = {<ai-1 , ai> | ai-1 , ai ∈ D , i = 2,....,n} 約定 a1 端為隊列頭,an 端為隊列尾
③ 基本操作:
InitQueue(&Q) 操作結果:構造空隊列 Q
DestroyQueue(&Q) 條件:隊列 Q 已存在;操作結果:隊列 Q 被銷毀
ClearQueue(&Q) 條件:隊列 Q 已存在;操作結果:將 Q 清空
QueueLength(Q) 條件:隊列 Q 已存在;操作結果:返回 Q 的元素個數,即隊列長度
GetHead(Q,&e) 條件:Q 為非空隊列;操作結果:用 e 返回 Q 的隊頭元素
EnQueue(&Q, e) 條件:隊列Q已存在;操作結果:插入元素 e 為 Q 的隊尾元素
DeQueue(&Q, e) 條件:Q為非空隊列;操作結果:刪除 Q 的隊頭元素,用 e 返回值
隊列的物理存儲可以用順序存儲結構,也可以用鏈式存儲結構。相應的,隊列的存儲方式分為兩種,即順序隊列和鏈式隊列
隊列的順序表示——用一維數組 base [MAXQSIZE]
#define MAXQSIZE 100 //最大隊列長度,如果有需要可以修改這個值 Typedef struct{ //看一下要存儲的是什么類型,就把 QElemType 進行對應修改 //比如要存儲 int 型,就把 QElemType 更換為 int QElemType *base; //初始化的動態分配存儲空間 // front 和 rear 稱作指針,卻不是指針變量,用以表示下標 int front; //頭指針,隊頭元素的下標 int rear; //尾指針,隊尾元素的下標 }SqQueue;
