隊列是先進先出(FIFO)的數據結構,插入操作叫做入隊,只能添加在隊列的末尾;刪除操作叫做出隊,只能移除第一個元素。在JS中,用數組可以很簡單的實現隊列。JavaScript實現排序算法
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。
原文地址:
隊列是先進先出(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。