隊列是一種特殊的線性表,特殊之處在於它只容許在表的前端(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