1、佇列的定義
佇列(queue)也是一種運算受限的線性表,它的運算限制與棧不同,是兩頭都有限制。插入僅僅能在表的一端進行(僅僅進不出),而刪除僅僅能在表的還有一端進行(僅僅出不進)。同意插入的一端稱為隊尾(rear),同意刪除的一端稱為隊頭 (front)
佇列模型
2、佇列的操作
佇列的操作原則是先進先出的。所以佇列又稱作fifo
表(first in first out)
置空隊:initqueue(q)
判隊空:queueempty(q)
判隊滿:queuefull(q)
入隊:enqueue(q,x)
出隊:dequeue(q)
取隊頭元素:queuefront(q)
不同於出隊,隊頭元素仍然保留
3、佇列的實現
1)順序實現/陣列實現
危急現象:假上溢
(由於在這裡,我們的佇列是儲存在乙個向量空間裡,在這一段連續的儲存空間中,由乙個佇列頭指標和乙個尾指標表示這個佇列,當頭指標和尾指標指向同乙個位置時,隊列為空,也就是說,佇列是由兩個指標中間的元素構成的。
在佇列中,入隊和出隊並非象現實中,元素乙個個地向前移動,走完了就沒有了,而是指標在移動,當出隊操作時。頭指標向前(即向量空間的尾部)新增乙個位置。入隊時,尾指標向前新增乙個位置,在某種情況下,比方說進乙個出乙個,兩個指標就不停地向前移動,直到佇列所在向量空間的尾部,這時再入隊的話,尾指標就要跑到向量空間外面去了,僅管這時整個向量空間是空的,佇列也是空的,卻產生了"上溢"現象,這就是假上溢。)
解決方式:迴圈佇列
(把向量空間彎起來,形成乙個頭尾相接的環形,這樣,當存於當中的佇列頭尾指標移到向量空間的上界(尾部)時,再加1的操作(入隊或出隊)就使指標指向向量的下界。也就是從頭開始。)
怎樣區分迴圈佇列是空的還是滿的?
方法1、設立乙個bool變數來推斷
方法2、少用乙個元素空間,當入隊時,先測試入隊後尾指標是不是會等於頭指標,假設相等則說明對慢了。不許入隊了。
方法3、利用計數器記錄佇列中元素的總數,隨時知道佇列的長度了
參考**:
typedef
struct queuerecord
queue;
/*操作演算法*/
void initqueue(*&q);
void enqueue(queue *q,elemtype elem);
void dequeue(queue *q,elemtype *elem);
int queueempty(queue q);
void getfront(queue q,elemtype *elem);
//初始化直接使用結構體指標變數。必須先分配記憶體位址
void initqueue(queue *&q)
//入隊
void enqueue(queue *q, elemtype elem)
//出隊
void dequeue(queue *q, elemtype *elem)
//獲取佇列頭元素
void getfront(queue q, elemtype *elem)
//推斷佇列是否為空
int queueempty(queue q)
2)鍊錶實現
參考**:
//鏈式佇列的結點的結構
typedef
struct lnode
lnode, *linklist;
//鏈式佇列
typedef
struct
queue
queue;
//各項演算法
void initqueue(queue *q);
void enqueue(queue *q, elemtype elem);
void dequeue(queue *q, elemtype *elem);
void getfront(queue q, elemtype *elem);
bool queueempty(queue q);
//初始化佇列
void initqueue(queue *q)
//入棧
void enqueue(queue *q, elemtype elem)
//出隊
void dequeue(queue *q, elemtype *elem)
//獲取對頭元素內容
void getfront(queue q, elemtype *elem)
//推斷佇列q是否為空
bool queueempty(queue q)
佇列的簡單應用
【舉例1】模擬印表機緩衝區
在主機將資料輸出到印表機時,會出現主機速度與印表機的列印速度不匹配的問題。
這時主機就要停下來等待印表機。
顯然,這樣會減少主機的使用效率。
為此人們設想了一種辦法:為印表機設定乙個列印資料緩衝區,當主機須要列印資料時。先將資料依次寫入這個緩衝區,寫滿後主機轉去做其它的事情,而印表機就從緩衝區中依照先進先出的原則依次讀取資料並列印,這樣做即保證了列印資料的正確性。又提高了主機的使用效率。由此可見,印表機緩衝區實際上就是乙個佇列結構。
【舉例2】銀行排隊
【舉例3】cpu分時系統
在乙個帶有多個終端的計算機系統中,同一時候有多個使用者須要使用cpu執行各自的應用程式,它們分別通過各自的終端向作業系統提出使用cpu的請求。作業系統通常依照每乙個請求在時間上的先後順序,將它們排成乙個佇列。每次把cpu分配給當前隊首的請求使用者。即將該使用者的應用程式投入執行,當該程式執行完成或用完規定的時間片後,作業系統再將cpu分配給新的隊首請求使用者,這樣即能夠滿足每乙個使用者的請求,又能夠使cpu正常工作。
4、c++ stl——queue用法
queue 模板類的定義在標頭檔案裡。
與stack 模板類非常相似,queue模板類也須要兩個模板引數,乙個是元素型別,乙個容器類
型,元素型別是必要的,容器型別是可選的。默覺得deque型別。
定義queue 物件的演示樣例**例如以下:
queueq1;
queueq2;
queue 的基本操作有:
入隊,如例:q.push(x);
將x 接到佇列的末端。
出隊,如例:q.pop();
彈出佇列的第乙個元素,注意。並不會返回被彈出元素的值。
訪問隊首元素,如例:q.front()
,即最早被壓入佇列的元素。
訪問隊尾元素,如例:q.back()
,即最後被壓入佇列的元素。
推斷佇列空。如例:q.empty()
,當佇列空時,返回true。
訪問佇列中的元素個數,如例:q.size()
資料結構 佇列
一 佇列的迴圈陣列實現。1 初始化 空佇列。令rear front 0。2 入佇列 約定rear指向佇列尾元素的下乙個位置。入佇列時,先判斷佇列是否已滿,而後將array rear x 然後rear 3 出佇列 約定front指向佇列的首元素位置。出佇列時,先判斷佇列是否為空,而後返回隊首元素re ...
資料結構 佇列
資料參考自 資料結構c 語言描述 佇列是一種先進先出的資料結構,這與棧正好相反。下例是簡單的queue實現 queue.h檔案 ifndef queue h define queue h include include 資料元素結構 自定義 struct datatype 佇列元素最大數 const...
資料結構 佇列
code for fun created by dream whui 2015 1 25 include stdafx.h include include using namespace std define true 1 define false 0 define ok 1 define erro...