隊列是先進先出(FIFO)的數據結構,插入操做叫作入隊,只能添加在隊列的末尾;刪除操做叫作出隊,只能移除第一個元素。在JS中,用數組能夠很簡單的實現隊列。數組
function Queue () { this.queue = []; } // 增長 Queue.prototype.enQueue = function(x) { this.queue.push(x); return true; } // 刪除 Queue.prototype.deQueue = function() { if(this.isEmpty()) { return false; } this.queue.shift(); return true; } // 獲取隊首元素 Queue.prototype.front = function() { if(this.isEmpty()) { return false; } this.queue[0]; } // 是否爲空 Queue.prototype.isEmpty = function() { return !this.queue.length }
以上就實現了隊列的數據結構,那麼隊列這種數據結構有什麼做用呢?在廣度優先搜索(BFS)中,很適合隊列。那什麼是BFS。在樹的遍歷中,有兩種遍歷方式,其中一種就是從根節點一層一層的往下遍歷,這就是廣度優先;另外一種是先由根節點選一條路徑直接遍歷到葉子節點,這就是深度優先搜索(DFS)。隊列能夠用在BFS中,下面咱們來實現一個廣度優先搜索的例子,返回目標節點深度。數據結構
let root = { key: 1, children: [ { key:2, }, { key:3, children:[ { key:4, } ] } ] } // 數據源 function bfs(root, target) { //利用上面建立的Queue,固然也能夠直接用數組實現 let queue = new Queue(); let step = 0; // 根節點到目標節點之間的深度 queue.enQueue(root); //將根節點加入 //遍歷隊列 while(!queue.isEmpty()) { step += 1; let len = queue.length; // 分層遍歷隊列,沒有目標元素則刪除該層元素,繼續遍歷下一層 for(let i =0; i<len; i++) { let cur = queue.front() // 獲取隊首元素 if(target === cur.key) return step; //若是是目標元素,返回 // 若是不是,將下一層節點加入到隊列 if(cur.children && cur.children.length) { cur.children.map(item => { queue.enQueue(item) }) } queue.deQueue() //而後將遍歷過的節點刪除, } } } bfs(root,4)
這樣咱們就完成了BFS的實現思路,你們可已參照該思路在具體的業務中靈活運用BFS。this