資料結構 佇列講解

2021-10-02 18:35:02 字數 2779 閱讀 4356

佇列知識講解

佇列是一種操作(或者說運算)受到限制的特殊線性表。其插入操作 限定在表的一端進行,稱為「入隊」;其刪除操作則限定在表的另一端進隊尾行,稱為「出隊」。插入一端稱為隊尾(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...