「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。
我个人觉得要想进大厂,就必须学习了解算法和数据结构,经历了多次面试之后,也知道了算法和数据结构的重要性,所以,我也打算从今天开始,进入学习,下载了一下电子书,边看书,边跟着书的例子来敲一下代码,下面就开始总结一下对算法和数据结构的学习吧。
第九天天:开始了解队列(堆)
队列?堆?
队列是遵循先进先出(FIFO)原则的一组有序的项。队列在尾部添加新的元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。
实现一套基于js对象的堆结构
需要有的方法
- enqueue(element(s)):想队列尾部添加一个(或多个)新的项。
- dequeue():移除队列的第一项(即排在队列最前面的项)并返回被移除的元素。
- peek():返回队列中第一个元素——最先被添加,也将最先被移除的元素。该方法在其他语言中也可以叫做front方法
- isEmpty(): 如果队列中不包含任何元素,返回true,否则返回false
- size():返回队列包含的元素个数。
创建队列
class Queue {
constructor() {
this.count = 0
this.items = {}
this.lowerCount = 0
}
enqueue(element) {
this.items[this.count] = element
this.count++
}
size() {
return this.count - this.lowerCount
}
isEmpty() {
return this.size() === 0
}
peek() {
if (this.isEmpty()) return undefined
return this.items[this.lowerCount]
}
dequeue() {
if (this.isEmpty()) return undefined
const result = this.items[this.lowerCount]
delete this.items[this.lowerCount]
this.lowerCount++
return result
}
clear() {
this.count = 0
this.lowerCount = 0
this.items = {}
}
toString() {
if(this.isEmpty()) return ''
let text = `${this.items[this.lowerCount]}`
for (let i = this.lowerCount + 1; i < this.count; i++) {
text = `${text},${this.items[i]}`
}
return text
}
}
使用队列
const queue = new Queue();
console.log(queue.isEmpty()); // 输出true
queue.enqueue('John');
queue.enqueue('Jack');
console.log(queue.toString()); // John,Jack
queue.enqueue('Camila');
console.log(queue.toString()); // John, Jack, Camila
console.log(queue.size()); // 输出3
console.log(queue.isEmpty()); // 输出false
queue.dequeue(); // 移除John
queue.dequeue(); // 移除Jack
console.log(queue.toString()); // Camila
用队列解决问题
- 击鼓传花游戏:在这个游戏中,孩子们围成一个圆圈,把花尽快地传递给旁边的人。某一时刻传花停止, 这个时候花在谁手里,谁就退出圆圈、结束游戏。重复这个过程,直到只剩一个孩子(胜者)。
function hotPotato(list, num) {
const queue = new Queue()
let peoples = list
let failPeoples = []
for(let i = 0; i < peoples.length; i++) {
queue.enqueue(peoples[i])
}
while(queue.size() > 1) {
for(let i = 0; i < num; i++) {
queue.enqueue(queue.dequeue())
}
failPeoples.push(queue.dequeue())
}
let winner = queue.dequeue()
return {winner,failPeoples}
}
const {winner,failPeoples} = hotPotato(['a同学','b同学','c同学','d同学','e同学'],7)
console.log('winner,failPeoples: ', winner,failPeoples); // winner,failPeoples: a同学 [ 'c同学', 'b同学', 'e同学', 'd同学' ]