一:基本概念
佇列是一種操作受到限制的特殊線性表。其插入操作限定在表的一端進行,稱為「入隊」;其刪除操作則限定在表的另一端進行,稱為「出隊」。插入一端稱為隊尾(rear);刪除一端稱為隊頭(front)。
佇列也被稱作「先進先出」線性表(fifo,first in first out)。類似於生活中排隊購票,先來先買,後來後買。
在不斷入隊、出隊的過程中,佇列將會呈現出以下幾種狀態:
隊空:佇列中沒有任何元素。
隊滿:佇列空間已全被占用。
溢位:當佇列已滿,卻還有元素要入隊,就會出現「上溢(overflow)」;當佇列已空,卻還要做「出隊」操作,就會出現「下溢(underflow)」。兩種情況合在一起稱為佇列的「溢位」。
二:佇列的基本操作
(1)初始化
使用陣列實現佇列時,初始狀態為front=0,rear=0.表示佇列裡沒有任何元素。如果有乙個元素,則front=0,rear=1。
void
clear()
(2)判空
bool
empty()
(3)求佇列中實際元素的個數
int
size()
4)入隊
入隊操作前,需要判斷佇列是否已滿。
void
push
(int x)
(5)出隊
void
pop(
)
(6)取隊首元素
int
get_front()
三:迴圈佇列隨著入隊與出隊操作的不斷進行,隊頭指標在陣列中不斷向隊尾方向移動,而在隊頭前面產生了一片不能利用的「空閒區」,當隊尾指標指向陣列最後乙個位置,即rear = maxn時,如果再有元素入隊就會出現「溢位」,這種溢位稱作「假溢位」。
如何解決這種情況呢?一種方法是每次出隊操作時,都向「空閒區」整體移動一位,帶來的後果是時間複雜度高了;另一種方法是讓陣列首尾相連,形成「環」狀,即所謂的「迴圈佇列」。
迴圈佇列初始時,front = rear = 0,如果 maxn 個元素乙個個依次入隊,則 rear = maxn,此時再有元素入隊,則它會被存放在 q[0] 這個單元,也會出現 front = rear = 0,與隊空時的狀態一樣。解決方法是少用乙個元素空間,約定資料入隊前,測試「隊尾指標在迴圈意義下加 1 後是否等於頭指標」作為判斷「隊滿」的條件。迴圈佇列的實際長度為 (rear - front + maxn) % maxn。
迴圈佇列的重要操作修改如下(使用 q[0] 這個單元):
(1)判斷隊滿:如果(rear + 1) % maxn = front,則佇列已滿。
(2)入隊:如果佇列未滿,則執行:rear = (rear + 1) % maxn;q[rear] = x;
(3)出隊:如果佇列不為空,則執行:front = (front + 1) % maxn;
四:取牌遊戲
【問題描述】
小明正在使用一堆共 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,…
【輸入格式】
第 1 行,3 個用乙個空格間隔的正整數 n、k 和 p。
【輸出格式】
m 行,從頂部按公升序依次輸出「good」牌的位置。
【輸入樣例】
3 9 2
【輸出樣例】37
8**:
#include
using
namespace std;
//定義陣列最大長度
const
int maxn =
100010
;//定義迴圈佇列陣列a
int a[maxn]
;//定義結果陣列
int result[maxn]
;int
main()
}//列印輸出,桶排序方法
for(
int i =
1; i <= k; i++
)return0;
}
執行結果:
參考:《資訊學奧賽課課通(c++)》
NEFUOJ P1633取牌遊戲 佇列 SET
本題是一道很明顯的佇列結構基礎應用 include using namespace std intmain sort good,good t for int i 0 i return0 佇列在此用了原始的queue佇列,但是考慮到其要將p個元素後置,其實還有一種更簡 ma 便 fan 的方法 使用雙...
C語言取牌遊戲
有54張撲克牌,兩個人輪流拿牌,每人每次最少取1張,最多取4張,誰拿最後一張誰輸。編寫模擬計算機先拿牌且必勝的演算法。分析 為了保證計算機勝利,因此最後的牌必須是人取到,而且只能剩餘1張。通過觀察發現,除去最後一張牌,還剩餘53張牌。除去第一次計算機取牌,之後的每次計算機如果要贏得遊戲,可以根據人取...
佇列及其應用
2 1為解決計算機主機與印表機之間速度不匹配問題,通常設定乙個列印資料緩衝區,主機將要輸出的資料依次寫入該緩衝區,而印表機則依次從該緩衝區中取出資料。該緩衝區的邏輯結構應該是?1分 堆疊佇列樹 圖 單位 浙江大學 2 2若已知一佇列用單向鍊錶表示,該單向鍊錶的當前狀態 含3個物件 是 1 2 3,其...