数据结构三:队

131 阅读1分钟

队列关键概念定义

  • 队列只能在队尾插入元素,在队首删除元素
  • 队列是一种先进先出(First-In-First-Out,FIFO)的数据结构
  • 插入新元素称作入队,删除操作也叫做出队
  • 有一些特殊的情况,在删除元素不必遵守先进先出的约定,比如急诊。这种应用我们需要优先队列的数据结构来模拟
  • 一些特殊的队列:双端队列、优先队列、循环队列
class Queue {
    constructor() {
        this.dataStore = {};
        this.lowestNumber = 0; // 指向队首的序号
        this.count = 0; // 指向队尾的序号
    }

    // 入队(队尾增加一个)
    enqueue(element) {
        this.dataStore[this.count++] = element;
    }

    // 出队(队首删除一个)
    dequeue() {
        if (this.isEmpty()) {
            return undefined;
        }
        const item = this.dataStore[this.lowestNumber];
        delete this.dataStore[this.lowestNumber++];
        return item;
    }

    // 查看队头元素
    peek() {
        if (this.isEmpty()) {
            return undefined;
        }
        return this.dataStore[this.lowestNumber]
    }

    // 查看队尾元素
    rear() {
        if (this.isEmpty()) {
            return undefined;
        }
        return this.dataStore[this.count - 1]
    }

    size() {
        return this.count - this.lowestNumber;
    }

    isEmpty() {
        return this.size() === 0
    }

    clear() {
        this.dataStore = {};
        this.lowestNumber = 0;
        this.count = 0;
    }
}

const queue = new Queue();
queue.enqueue("🍊");
queue.enqueue("🍎");
queue.enqueue("🍌");
queue.dequeue();
queue.enqueue("🍌");
// console.log(queue);


// 击鼓传花
// 循环队列

/**
 * @params(Array[string])
 * @params(ANumber)
 * @return Object
 */

const hotPotato = (peoples, times) => {
    const queue = new Queue();
    const loserArr = [];
    for (let i = 0; i < peoples.length; i++) {
        queue.enqueue(peoples[i]);
    }

    while (queue.size() > 1) {
        for (let i = 0; i < times; i++) {
            queue.enqueue(queue.dequeue());
        }
        loserArr.push(queue.dequeue())
    }

    // return queue.dequeue();
    return {
        loserArr,
        winner: queue.dequeue()
    }
};
// 5个小孩 1面鼓   10
const people = ["🍊", "🍎", "🍌", "🍓", "🍍"];

console.log(hotPotato(people, 10));