队列是一种特殊的线性表,特殊之处在于它只容许在表的前端(front)进行删除操做,而在表的后端(rear)进行插入操做,和栈同样,队列是一种操做受限制的线性表。进行插入操做的端称为队尾,进行删除操做的端称为队头。队列中没有元素时,称为空队列。 队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。由于队列只容许在一端插入,在另外一端删除,因此只有最先进入队列的元素才能最早从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。前端
这里依然用js的数组模拟队列,毕竟高级语言(落泪),数组的shift时删除数组的第一个元素,这里list仍是公用的后端
class Queue{
constructor(){
this.list=[];
this.length=0;
}
/* 入队 */
enquequ(value){
this.length++;
this.list.push(value);
}
/* 出队 */
dequeue() {
if (this.length === 0) return;
this.length--;
return this.list.shift();
}
/* 查看队头 */
peek() {
return this.list[0];
}
/* 查看队头 */
isEmpty(){
return this.length ===0;
}
}
复制代码
简单来讲,比方说我是会员,我就要排在你的前面,hhhhhh数组
实现一个优先队列,有两种选项:设置优先级,而后在正确位置添加元素;或者用入列操做添加元素,而后按照优先级移除他们。bash
function PriorityQueue(){
let items = [];
// 辅助类
function QueueElement(element,priority){
this.element = element;
this.priority = priority;
}
this.enquequ=function(element,priority){
let queueElement = new QueueElement(element,priority);
let added =false;
// 比较优先级
for (let i = 0; i < items.length; i++) {
// 若是说个人优先级比较大
if(queueElement.priority>items[i].priority){
// 数组切割,实现添加操做
items.splice(i,0,queueElement);
added=true;
break;
}
}
// 若是没有插入就是说个人优先级都比他们小,就放到队尾
if(!added){
items.push(queueElement);
}
};
// 打印
this.print=function(){
for (let i = 0; i < items.length; i++) {
console.log(`${items[i].element}- ${items[i].priority}`);
}
}
}
let priorityQueue = new PriorityQueue();
priorityQueue.enquequ("skl",2);
priorityQueue.enquequ("skl2",1);
priorityQueue.enquequ("skl3",3);
priorityQueue.print();
复制代码
若是队列为空,就直接插入,若是不为空,就进行优先级比较操做。中间使用了一个辅助类,用来建立名字和优先级的对象ui
{
element:'skl',
priority:'1',
}
复制代码
不懂得网上百度一下啥事击鼓传花this
function hotPotato(nameList,num){
let queue = new Queue();
// 先入队
for (let i = 0; i < nameList.length; i++) {
queue.enquequ(nameList[i]);
}
// 被淘汰者
let eliminated="";
while(queue.length>1){
for (let i = 0; i < num.length; i++) {
// 出队后入队,就是从队头到队尾去
queue.enquequ(queue.dequeue());
}
// 等于num的那个被淘汰
eliminated=queue.dequeue();
console.log(eliminated+"在击鼓传花中淘汰");
}
// 循环结束后只有一我的的时候他就是获胜者了
return queue.dequeue();
}
let names = ["John","Jack","Camilia","Ingrid","Carl"];
let winner = hotPotato(names,2);
console.log("获胜者是"+winner);
复制代码
输出过程spa
John在击鼓传花中淘汰
Jack在击鼓传花中淘汰
Camilia在击鼓传花中淘汰
Ingrid在击鼓传花中淘汰
获胜者是Carl
复制代码
下图模拟了这个过程 code