資料結構 佇列

2021-07-27 11:52:58 字數 3290 閱讀 6951

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

佇列的資料元素又稱為佇列元素。在佇列中插入乙個佇列元素稱為入隊,從佇列中刪除乙個佇列元素稱為出隊。因為佇列只允許在一端插入,在另一端刪除,所以只有最早進入佇列的元素才能最先從佇列中刪除,故佇列又稱為先進先出(fifo—first in first out)線性表。佇列的實現有順序佇列、迴圈佇列和鍊錶佇列。這裡我用了迴圈佇列和鍊錶佇列兩種。

順序佇列:

與順序表一樣,順序佇列需要分配一塊連續的區域來儲存佇列的元素,需事先定義資料大小。當佇列滿入隊是會出現上溢的現象,佇列空出隊會產生下溢的想象。這是後要想繼續操作,需要對資料進行移動,效率不佳。

迴圈佇列:

迴圈佇列多使用乙個資料大小的空間用來表示佇列空或者佇列滿。也就是說迴圈佇列的儲存空間中最大資料個數加一(倘若不犧牲著乙個資料大小的空間,就需要額外宣告乙個標誌位flag。初始情況下flag=0,front=rear表示佇列空。第二次front=rear,flag=1,表示佇列滿)。迴圈佇列中中有三種狀態:

front==rear ( 隊列為空狀態 )

front!=(rear+1)%maxsize ( 佇列的一般狀態 )

front==(rear+1)%maxsize ( 隊列為滿的狀態 )

如下圖所示,迴圈佇列中能訪問的最大資料個數為7個,但需要申請8個資料大小的空間。第一種情況中:佇列中沒有資料,此時front=rear=0,隊列為空;第二種情況中:佇列中有乙個資料,front=0、rear=1,佇列處於一般狀態,既能進隊也能出隊;第三種情況:佇列滿,front=0,rear=7,此時滿足front=(rear+1)%maxsize。在佇列常用的操作:列印、入隊、出隊、獲取隊頭、隊尾資料值中。列印、入隊、出隊、獲取隊尾資料值中要注意該佇列是迴圈佇列,可能出現rear>front的情況,需要處理一下。

void dis();//列印佇列元素

void del();//刪除

void push(int item);//item入隊

void pop();//出隊

void creat(int num);//建立num個元素的測試佇列

bool isempty();//是否空

bool isfull();//是否空

bool getfront(int &val);//讀取隊頭元素

bool getrear(int &val);//讀取隊尾元素

};void arrayqueue::dis()

else

cout

<< queue[i] << endl;}}

else

cout

<< "佇列空。"

<< endl;

}void arrayqueue::del()

void arrayqueue::push(int item)

else

}void arrayqueue::pop()

else

}void arrayqueue::creat(int num)

bool arrayqueue::isempty()

bool arrayqueue::isfull()

bool arrayqueue::getfront(int& val)

else

}bool arrayqueue::getrear(int& val)

else

}int main()

鍊錶佇列:

鏈式佇列是基於單鏈表的儲存表示,隊頭指標front指向隊頭結點,隊尾指標rear指向隊尾結點。鍊錶中所有的結點都必須通過這兩個指標訪問到,並且隊頭端只能用來刪除結點,隊尾端用來插入結點。如下圖所示:n個元素的佇列中,隊頭指標指向鍊錶中第乙個資料、隊尾指標指向鍊錶中最後乙個資料,其中出、入隊方向就是箭頭描述的方向。

void dis();//列印佇列元素

void del();//刪除

void push(int item);//item入隊

void pop();//出隊

void creat(int num);//建立測試佇列

bool isempty();//是否空

bool getfront(int &val);//讀取隊頭元素

bool getrear(int &val);//讀取隊尾元素

};void quelist::dis()

else

t = t->next;}}

else

}void quelist::del()

rear = null;

length = 0;

}}void quelist::push(int item)

else

length += 1;

}void quelist::pop()

}void quelist::creat(int num)

}bool quelist::isempty()

bool quelist::getfront(int& val)

else

return

false;

}bool quelist::getrear(int& val)

else

return

false;

}int main()

鏈式佇列中發現了乙個以前一直沒發現的問題。當乙個指標指向的空間已經被釋放後,它的值是什麼?訪問它會怎麼樣?它的值還是被釋放掉的那塊空間的位址,訪問它程式會崩潰。

資料結構 佇列

一 佇列的迴圈陣列實現。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...