队列queue 先进先出
队列queue 先进先出
队列只能在尾部添加元素(入队),在头部删除元素(出队)
类比:排队
队列实现
class Queue { constructor() { this.items = [] } // 入队 从对尾添加元素 enqueue(item) { this.items.push(item) } // 出队 从队列头部删除第一个元素 dequeqe() { return this.items.shift() } // 返回队列头部的元素 head() { return this.items[0] } // 返回队列尾部的元素 tail() { return this.items[this.items.length - 1] } size() { return this.items.length } isEmpty() { return this.items.length === 0 } // 清空队列 clear() { this.items.length = 0 } }
队列题目
// 有一个数组存放0-99数字,要求每隔2个数字删除一个数(每3个删除一个),到末尾时循环至开头继续进行,求最后一个被删除的数字
// 0 1 2 3 4 5 6 7 8 9 10 每隔2个数字删除一个数字,也就是把2 5 8 删除了
function delRing() { const queue = new Queue() for (let i = 0; i < 100; i++) { queue.enqueue(i) //0-99数字入队操作 } let index = 0 while (queue.size() !== 1) { let item = queue.dequeue() //首先逐一出队 index++ //记录每次删除头部元素(这个动作) index+1 if (index % 3 !== 0) { queue.enqueue(item) //把不要删除的数字入队 } } return queue.head() }
//斐波那契数列 F(1)=0,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
//斐波那契数列 F(1)=0,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*) function fibonacci(n) { const queue = new Queue() queue.enqueue(0) queue.enqueue(1) let index = 0 // 重复执行删一个 加一个的动作 while (index < n - 2) { let del_head = queue.dequeue() //头部删除 let head = queue.head() let next_item = del_head + head queue.enqueue(next_item) //尾部添加 index++ } return queue.tail() }