佇列知識講解
佇列是一種操作(或者說運算)受到限制的特殊線性表。其插入操作 限定在表的一端進行,稱為「入隊」;其刪除操作則限定在表的另一端進隊尾行,稱為「出隊」。插入一端稱為隊尾(rear);刪除一端稱為隊頭( ront)。
假設有佇列q=(a1,a2,a3,…,an),則佇列q中的元素是按a1,a2,a3,…an的順序依次入隊,也只能按照a1,a2,a3,…,an的順序依次出隊。因此,佇列也被稱作「先進先出」線性表(fifo, first in first out)。類似於生活中的排隊購票,先來先買,後來後買。
在不斷入隊、出隊的過程中,佇列將會呈現出以下幾種狀態:
隊空:佇列中沒有任何元素。
隊滿:佇列空間已全被占用。
溢位:當佇列已滿,卻還有元素要入隊,會出現「上溢(overflow);當佇列已空,卻還要做「出隊」操作,就會出現「下溢( underflow)。兩種情況合在一起稱為佇列的「溢位」。
在計算機中,實現或者儲存佇列有陣列模擬與鍊錶模擬兩種方法,一般使用前者。假設用陣列q[maxn+1]來儲存佇列,需要設定兩個指標:頭指標 front和隊尾指標 rear為簡化操作,
通常約定 front指向隊頭元素的前乙個位置,rear就指向隊尾元素。
佇列基本操作
• 佇列的基本操作:
(1)初始化佇列 queuevis,定義乙個佇列
(2)入隊 vis.push(x)
(3)出隊 vis.pop()
(4)判斷佇列是否為空 vis.empty()
(5)判斷佇列中元素的數量vis.size()
(6)得到佇列的隊首元素 vis.front()
綜上: #include 用則無需考慮標頭檔案。
例題1週末舞會
• 例1假設在週末舞會上,男士們和女士們進入舞廳時,各自排 成一隊。跳舞開始時,依次從男隊和女隊的隊頭上各出一人 配成舞伴。規定每個舞曲能有一對跳舞者。若兩隊初始人數 不相同,則較長的那一隊中未配對者等待下一輪舞曲。現要 求寫乙個程式,模擬上述舞伴配對問題。
• 輸入:第一行兩隊的人數 2 4
• 第二行舞曲的數目 6
過程分析
**如下
#include
using
namespace std;
queue<
int>vis1,vis2;
intmain()
}return0;
}
例題2
取紙牌遊戲
小明正在使用一堆共 k 張紙牌與 n-1 個朋友玩取牌遊戲。其中, n≤k≤100000,2≤n≤100,k 是 n 的倍數。紙牌中包含 m=k/n 張 「good」牌和 k-m 張「bad」牌。小明負責發牌,他當然想自己獲得所有 「good」牌。 • 他的朋友懷疑他會欺騙,所以他們給出以下一些限制,以防小明耍詐:
• 1)遊戲開始時,將最上面的牌發給小明右手邊的人。
• 2)每發完一張牌,他必須將接下來的 p 張牌(1≤p≤10)一張一張地依 次移到最後,放在牌堆的底部。
• 3)以逆時針方向,連續給每位玩家發牌。 • 小明迫切想贏,請你幫助他算出所有「good」牌放置的位置,以便他得到所 有「good」牌。牌從上往下依次標註為 #1,#2,#3,…
解題思路
發現「good」的牌都發給了小明自己,根據題目描述的n的倍數都 發給了小明自己,所以當k 是n的倍數時,就存入到乙個陣列當中 去。對於這個p要格外注意,當剩餘的牌的個數小於p的時候也要 p次。例如: 例如: p=3;
還剩下的編號 為4 和5;`
第1次翻:5 4;
第2次翻:4 5;
第3次翻:5 4; 也是要翻3次的,哪怕就省下1張牌了,也要翻p次!
**如下
#include
using
namespace std;
queue<
int>visa;
int a[
100000];
intmain()
int num=0;
int j=0;
int s1;
int tmp;
while
(!visa.
empty()
)for
(int i=
1;i<=p;i++)}
sort
(a,a+j)
;for
(int i=
0;i)printf
("%d\n"
,a[i]);
}return0;
}
例題三
報數-佇列-約瑟夫環
n個小朋友們坐成乙個圓圈,編號分別為1,2,3…n;第1個小朋友從1開始報數,報到m的小朋友離開座位;然後下乙個小朋友從1接著報數;直到剩下最後乙個小朋友為止;
input
輸入2個數字n和m;(1<=n,m<=1000)
output
輸出最後乙個小朋友的編號!
sample input
10 5
sample output
3
#include
using
namespace std;
queue<
int>vis;
intmain()
printf
("%d\n"
,vis.
front()
);}return0;
}
資料結構 棧講解
棧的基本原理 知識講解 棧也是一種操作 或者說運算 受到限制的特殊線性表。其插入進棧和刪除操作都限制在表的一端進行,這一端被稱為 棧頂 top 相對a的另一端稱為 棧 bottom 插入操作一般稱之為 進棧 push 或者 壓棧 刪除操作稱之為 出棧 pop 棧的特點是 先進後出 fifo,firs...
資料結構 佇列
一 佇列的迴圈陣列實現。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...