佇列和優先佇列

2021-10-02 23:04:10 字數 4215 閱讀 5827

佇列是一種先進先出的資料結構

可以定義乙個結構體,表示乙個佇列。

struct _queue

;

另外c++中有stl標準模板庫

封裝了queue類

標頭檔案#include < queue >

queue<

int>vis;

vis.

pop();

//刪除隊首元素

vis.

back()

;//返回隊尾元素

vis.

front()

;//返回隊首元素

vis.

empty()

;//判斷是否為空,空為true,非空為false。

vis.

push

(x);

//從隊尾插入元素x

vis.

size()

;//求佇列中元素個數

nefu 1634 報數-佇列-約瑟夫環

description

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;

struct _queue

;int

main()

while

(vis.tail-vis.head>1)

vis.head++;}

printf

("%d\n"

,vis.num[vis.head]);

return0;

}

使用stl

#include

using

namespace std;

intmain()

while

(vis.

size()

>1)

vis.

pop();

}printf

("%d\n"

,vis.

front()

);return0;

}

可以說bfs的實現就是佇列

具體等學bfs時寫

貼道題nefu 1663 關係網路-佇列

description

有 n 個人,他們的編號為 1~n,其中有一些人相互認識,現在 x 想要認識 y,可以通過他所認識的人來認識更多的人(如果 a 認識 b,b 認識 c,那麼 a 可以通過 b 來認識 c),求出 x 最少需要通過多少人才能認識 y。

input

第 1 行 3 個整數 n、x、y,2≤n≤100;

接下來的 n 行是乙個 n×n 的鄰接矩陣,

a[i][j]=1 表示 i 認識 j,a[i][j]=0 表示不認識。

保證 i=j 時,a[i][j]=0,並且 a[i][j]=a[j][i]。

output

一行乙個整數,表示 x 認識 y 最少需要通過的人數。資料保證 x 一定能認識 y。

sample input

5 1 5

0 1 0 0 0

1 0 1 1 0

0 1 0 1 0

0 1 1 0 1

0 0 0 1 0

sample output

2

#include

using

namespace std;

struct sa

;int

main()

;for

(i=1

;i<=n;i++

) vis.

push()

; b[x]=1

;while

(!vis.

empty()

)for

(i=1

;i<=n;i++))

; b[i]=1

;}}}

return0;

}

實現方法沒細講

應該是二叉堆(沒學)

priority_queue <

int,vector<

int>

,greater<

int>

>vis;

//第三個,寫greater,則小的優先順序高,不寫或者寫less,則大的優先順序高; vis.empty();//判斷是否為空

vis.

pop();

//刪除優先順序最高元素

vis.

push

(x);

//插入元素x

vis.

size()

;//求元素個數

vis.

top();

//返回優先順序最高元素

nefu 1688 合併果子-優先佇列

description

在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。

每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過 n-1 次合併之後, 就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。

因為還要花大力氣把這些果子搬回家,所以多多在合併果子時要盡可能地節省體力。假定每個果子重量都為 1 ,並且已知果子的種類 數和每種果子的數目,你的任務是設計出合併的次序方案,使多多耗費的體力最少,並輸出這個最小的體力耗費值。

例如有 3 種果子,數目依次為 1 , 2 , 9 。可以先將 1 、 2 堆合併,新堆數目為 3 ,耗費體力為 3 。接著,將新堆與原先的第三堆合併,又得到新的堆,數目為 12 ,耗費體力為 12 。所以多多總共耗費體力 =3+12=15 。可以證明 15 為最小的體力耗費值。

input

共兩行。

第一行是乙個整數 n(1≤n≤10000) ,表示果子的種類數。

第二行包含 n 個整數,用空格分隔,第 i 個整數 ai(1≤ai ≤20000) 是第 i 種果子的數目。

output

乙個整數,也就是最小的體力耗費值。輸入資料保證這個值小於 2^31。

sample input

31 2 9

sample output

15

#include

using

namespace std;

intmain()

int s=

0,m=0;

for(i=

1;i)printf

("%d\n"

,s);

}return0;

}

如果元素是結構體,需要過載運算子來設定優先順序

#include

using

namespace std;

struct sa

;bool

operator

<

(const sa &s1,

const sa &s2)

//過載小於號

intmain()

);}for

(int i=

1;i<=n;i++))

;}}return0;

}

FIFO佇列和優先佇列

fifo佇列相當於一般的佇列 優先隊列為操作時有優先順序的佇列 1.標頭檔案 include 2.fifo佇列 queue 型別名 變數名 3.優先佇列 priority queue 型別名 變數名 1.預設優先順序為優先順序最高的先出隊,預設的int型別的優先佇列中先出隊的為佇列中較大的數。2.小...

FIFO佇列和優先佇列

fifo佇列 定義 先進先出的儲存結構 刪除時先刪最後乙個元素 queue 型別 q 增 q.push 元素值 在隊尾加入乙個元素 void刪 q.pop 刪除元素,刪除隊首元素 void改 查 q.size 返回佇列中剩餘元素個數 int q.empty 返回佇列是否為空 bool q.front...

佇列以及優先佇列

1.佇列 佇列的定義 標頭檔案 include 佇列是一種先進先出的資料結構 佇列的宣告 queueq 宣告字元型別 queueq 宣告結構體型別 以及可以宣告一些自定義的型別 佇列的操作 入佇列 s.push x 出佇列 s.pop 返回佇列的資料數量 s.size 判斷佇列是否為空 s.empt...