線性表是最基本,最簡單,最常用的一種資料結構。線性表中資料元素之間的關係是一對一的關係,即除了第乙個和最後乙個資料元素之外,其他資料元素均有唯一的前驅元素和後繼元素。
線性表的特徵如下:
集合中一定存在唯一的乙個「第乙個元素」
集合中一定存在唯一的乙個「最後元素」
除最後乙個元素外,其他元素均有唯一的後繼元素
除第乙個元素外,其他元素均有唯一的前驅元素
佇列(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號元素位置的時候,當此時再有元素入...