佇列和迴圈佇列

2021-07-28 04:47:26 字數 2443 閱讀 1340

線性表是最基本,最簡單,最常用的一種資料結構。線性表中資料元素之間的關係是一對一的關係,即除了第乙個和最後乙個資料元素之外,其他資料元素均有唯一的前驅元素和後繼元素。

線性表的特徵如下:

集合中一定存在唯一的乙個「第乙個元素」

集合中一定存在唯一的乙個「最後元素」

除最後乙個元素外,其他元素均有唯一的後繼元素

除第乙個元素外,其他元素均有唯一的前驅元素

佇列(deque)是一種運算受限的線性表,他的兩頭都有運算限制,插入只能在表的一段進行(只進不出),而刪除只能在表的另一端進行(只出不進)。允許插入的一段稱為隊尾(rear),允許刪除的一端稱為隊頭(front)。佇列的操作原則是先進先出,因而佇列又稱作fifo表,佇列一般具有兩種物理結構:一種是順序結構,一種是鏈式結構。

佇列型別的定義:

#define maxlen 1000

struct seqqueue;

佇列的初始化:

void initseqqueue(queue &q)

判斷佇列是否為空:

bool isempty(queue &q)

判斷佇列是否滿:

bool isfull(queue &q)

入隊操作:

bool push(queue &q,int dt)

出隊操作:

void pop(queue &q)

取隊頭元素:

bool get(queue &q,int &dt)

迴圈佇列(circular queue)是順序佇列的乙個空間優化。順序佇列中元素是順序儲存表示的,用一組位址連續的儲存單元一次存放從隊頭到隊尾的元素,指標front和rear分別指示隊頭元素和隊尾元素的位置。在有限的空間內,front和rear指標永遠是增1的操作,一直到佇列滿時停止入隊。但是,此時該空間並沒有完全使用到,空間利用率不高。

解決方案:將順序佇列臆造為乙個環狀空間,形成迴圈佇列。

1. 實現迴圈佇列的方法如下:

隊頭、隊尾指標加1,可用取模(餘數)運算實現。

隊頭指標進1:front = (front+1)%maxlen

隊尾指標進1:rear = (rear+1)%maxlen

佇列初始化:front = rear = 0

隊空條件:front == rear

隊滿條件:(rear+1)%maxlen == front

2. 實現**

迴圈佇列的型別定義:

#define maxlen 100

struct cyclequeue;

佇列的初始化:

void initqueue(cyclequeue &q)

佇列的判空:

bool isempty(cyclequeue &q)

佇列的判滿:

bool isfull(cyclequeue &q)

入隊操作:

bool push(cyclequeue &q,int dt)

出隊操作:

bool pop(cyclequeue &q)

取隊頭元素:

bool getfront(cyclequeue &q,int &dt)

【例題:】士兵佇列訓練問題

某部隊進行新兵佇列訓練,將新兵從頭開始按順序依次編號,並排成一行橫隊,訓練的規則如下:從頭開始一至二報數,凡報到2出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報道三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數

… ,以後從頭開始進行一至二報數,一至三報數,知道剩下的人不超過三人為止。輸入的士兵人數不超過5000人。輸入樣例第一行為組數n,接下來n行是士兵數。輸出剩下的士兵編號。

參考**

#include 

#include

#include

#define n 5002

using namespace std;

struct q

bool empty()

bool isfull()

void push(int dt)

void pop()

int gettop()

bool ch()

}q[2];

int main()

int now = 0,pre = 1; //now表示當前存士兵的佇列,pre表示另乙個存士兵的佇列

i = 0;

while(!q[now].ch()) //用兩個佇列模擬報數過程

}else

}i ^= 1;

swap(now,pre); //交換工作佇列

}printf("%d\n",q[now].gettop());

while(!q[now].empty())

puts(" ");

}}

迴圈佇列和佇列

描述 根據給定的空間構造順序迴圈佇列,規定隊滿處理方法為少用乙個元素空間。例如,給定5個元素空間構造迴圈佇列,則只能存放4個元素。試根據入隊及出隊操作判斷佇列最後的元素存放情況,並輸出最後佇列中的元素值,即完成給定入隊及出列操作後一次性全部出隊的元素值。要求採用順序佇列完成。輸入 輸入的第一行為乙個...

佇列(單鏈佇列和迴圈佇列)

和線性表類似,佇列也有兩種儲存表示 鏈佇列 為操作方便,給鏈佇列新增乙個頭結點 佇列的鏈式儲存結構 typedef struct qnodeqnode,queueptr typedef struct linkqueue 1 include2 include3 include4 typedef str...

佇列 迴圈佇列

迴圈佇列是乙個大小確定的特殊佇列,它的特殊體現在迴圈,之前提到的普通佇列,我們是用鍊錶來實現的,在這裡,由於迴圈佇列是乙個長度確定的佇列,所以我們可以拿順序表來實現。迴圈佇列的操作與普通佇列類似,不過不同的地方在於當rear走到capacity 1並且front在0號元素位置的時候,當此時再有元素入...