天天看點

隊列與BFS的簡單介紹隊列

隊列

隊列是一種特殊的線性表,特殊之處在于它隻允許在表的前端(front)進行删除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行删除操作的端稱為隊頭。隊列具有先進先出的特點。

如圖

隊列與BFS的簡單介紹隊列

當在隊列中進行讀取操作(front)時,會讀取隊首元素,也就是元素1,使用pop時删除的也是隊首元素,經過front與pop操作,隊列會變成

隊列與BFS的簡單介紹隊列

而進行插入操作,則會在隊尾執行,假設執行push操作,添加元素5,會出現

隊列與BFS的簡單介紹隊列

使用隊列時需頭檔案queue

#include<queue>
           

定義變量

queue<int>q  //括号内為隊列的變量類型
           

隊列的一些操作函數的簡單使用

q.front()//取隊列中第一個元素
q.pop()//删除隊列中第一個元素
q.empty()//判斷隊列是否為空,為空時傳回1;
q.push()//将某元素插入隊列
           

BFS即廣度優先搜尋,是最簡便的圖的搜尋算法之一,這種方法不考慮需要查找的具體結果,就是從某一點出發周遊整個圖,直到找到結果。所謂廣度優先搜尋,就是從某一點出發,優先搜尋與其相鄰的點,搜尋完成之後,繼續搜尋已經搜尋過的相鄰點的相鄰點。舉個栗子

觀察下面二叉樹(就是每個點的下方隻有兩條分叉的圖)

隊列與BFS的簡單介紹隊列

當從樹的頂點a開始搜尋時,設a是第一層的元素。優先搜尋其相鄰點,就是b和c,也就是第二層元素。搜尋完a的相鄰節點(第二層元素搜尋結束),繼續搜尋其相鄰點的相鄰節點(第三層元素,已搜尋過不需搜尋),就是搜尋b的相鄰節點d與e,完成後搜尋c的相鄰節點。這個過程我是利用隊列來完成的,利用隊列先進先出的特點,不使用隊列也可以。(個人覺得使用隊列解決BFS問題超級友善)

廣度優先搜尋,不太合理的講,就是一層一層的搜尋(不搜尋完就不進入下一層的搜尋),搜尋完一層,緊接着搜尋下一層,與其對應的是深度優先搜尋(DFS),像是一條路走到黑的倔驢。

以上均為個人觀點,僅是對隊列的一些簡單使用及BFS的了解,如有錯誤請指出,勿噴,不勝感激

---------------------------------------------------------------------------一隻走在ACM路上的弱渣

ACM