学习js数据结构与算法-队列(堆)

107 阅读2分钟

「这是我参与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同学' ]