一,队列
概念和结构
- 队列是一种先进先出(FIFO)的数据结构。
- 队列的第一个元素所在位置称为队头,最后一个元素所在位置称为队尾。
- 不包含任何元素的队列称为空队列。
队列基本操作
- enqueue(element):向队列尾部添加一个新的项
- dequeue():出队,移除队列的第一项,并返回被移除的元素
- front():返回队列中第一个元素(不移除元素,只返回信息)
- isEmpty():(empty:空的)队列为空,返回true,否则返回flase
- size():返回队列包含的元素个数,与数组的length类似
- toString():将队列中的内容,转成字符串形式
封装队列
function Queue() {
//属性
this.items = [],
//方法
Queue.prototype.enqueue = function (element) {
this.items.push(element);
}
Queue.prototype.dequeue = function (element) {
//使用js中的shift方法,移除第一个元素
return this.items.shift();
}
Queue.prototype.front = function (element) {
return this.items[0];
}
Queue.prototype.isEmpty = function () {
return this.items.length === 0;
}
Queue.prototype.size = function () {
return this.items.length;
}
Queue.prototype.toString = function () {
let resultString = '';
for (let i = 0; i < this.items.length; i++) {
resultString += this.items[i] += " ";
}
return resultString;
}
}
例:击鼓传花
几个朋友围成一圈,开始数数,数到某个数字的人自动淘汰。
最后剩下的这个人将会获得胜利,请问最后剩下的是原来在那个位置上的人?
//封装一个基于队列的函数
// 参数:所有参与人的姓名,基于的数字
// 结果:最终剩下的一人的姓名
function passGame(nameList, number) {
//创建一个队列
let queue = new Queue();
//将所有人依次进入队列中
for (var i = 0; i < nameList.length; i++) {
queue.enqueue(nameList[i]);
}
//开始数数字
for (var num = 1; queue.size() > 1; num++) {
if (num != number) {
var elem = queue.front();
queue.enqueue(elem);
queue.dequeue();
} else {
queue.dequeue();
num = 0;
}
}
return queue;
}
var list = ['aaa', 'bbb', 'ccc', 'ddd', 'eee'];
var n = 3;
console.log("最终剩下的人是:" + passGame(list, n));