資料結構 佇列

2021-09-22 09:43:53 字數 4050 閱讀 7261

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...