队列的实现
和栈的实现相似,但是这里使用对象的方式,对象的key是数字的实现,类似数组。
/** * 队列 */ class Queue { #count = 0; //队列最大数量 #lowestCount = 0; //目前第一个元素的下标 #items = {}; //队列 constructor() { } //增加元素 enqueue(element) { this.#items[this.#count] = element; this.#count++; } //移除元素 dequeue() { if (this.isEmpty()) { return undefined; } const result = this.#items[this.#lowestCount]; delete this.#items[this.#lowestCount]; this.#lowestCount++; return result; } //队列是否为空 isEmpty() { // return this.#count - this.#lowestCount === 0; return this.size() === 0; } //查看队列头元素 peek() { if (this.isEmpty()) { return undefined; } return this.#items[this.#lowestCount]; } //队列中有几个元素 size() { return this.#count - this.#lowestCount; } //清空队列 clear() { this.#count = 0; this.#lowestCount = 0; this.#items = {}; } //toString toString() { if (this.isEmpty()) { return ''; } let objString = `${this.#items[this.#lowestCount]}`; for (let i = this.#lowestCount + 1; i < this.#count; i++) { objString = `${objString}, ${this.#items[i]}`; } return objString; } } const q1 = new Queue() q1.enqueue(1) q1.enqueue(2) q1.enqueue(3) q1.dequeue() console.log(q1)
这里新增3个元素,删除一个元素。
返回q1的值:
实际击鼓传花:
游戏规则:一些人围成一圈,开始一个个传花,传花n次(可多可少),单次结束时,淘汰收到花的人,之后从下个人继续,以此类推。到最后剩余一人结束。
使用队列实现过程:
//击鼓传花 function hotPotato(elementsList) { const queue = new Queue(); const elimitatedList = [];//移除了的人 for (let i = 0; i < elementsList.length; i++) { queue.enqueue(elementsList[i]); } while (queue.size() > 1) { //传花中 const num = Math.round(Math.random() * 5 + 5)//传花次数 随机5-10次 for (let i = 0; i < num; i++) { queue.enqueue(queue.dequeue());//移除1人并添加1人 拿到花的是第一个 送出花的是最后一个 形成传递圈 } let ycitem = queue.dequeue();//本次移除的人 elimitatedList.push(ycitem); console.log('传花次数', num, '被淘汰人员', ycitem) } console.log('胜者', queue.dequeue()) } hotPotato(['赵大', '钱二', '张三', '李四', '王五'])
结果打印: