隊列和棧非常類似,但是使用了不同的原則,而非後進先出,是先進先出。
1.隊列數據結構
隊列遵循FIFO(先進先出,也稱先來先服務)原則的一組有序的項。隊列在尾部添加新元素,並從頂部移除元素。最新添加的元素必須排在隊列的的末尾。隊列示意圖如下:
2.創建隊列
// 創建一個類表示隊列
function Queue() {
// 使用數組作爲存儲隊列的數據結構
let items = [];
// 下面聲明隊列一些可用的方法
// 1.enqueue(elements) 向隊尾添加一個或多個項
this.enqueue = function(element) {
items.push(element);
}
// 2.dequeue() 從隊列移除元素 FIFO
this.dequeue = function() {
return item.shift();
}
// 3.front() 查看隊列頭元素
this.front = function() {
return items[0];
}
// 4.isEmpty() size() 檢查隊列是否爲空
this.isEmpty = function() {
return items.length === 0;
}
this.size = function() {
return items.length;
}
// 5.打印隊列元素
this.print = function() {
console.log(items.toString())
}
}
使用Queue類
let queue = new Queue();
console.log(queue.isEmpty()); // true
// 添加元素
queue.enqueue('june');
queue.enqueue('jack');
queue.print(); // 'june,jack'
console.log(queue.size()); // 2
// 刪除元素
queue.dequeue();
queue.dequeue();
queue.print(); // ''
3.優先隊列
實現一個有限隊列,有兩種選擇:設置優先級,然後在正確的位置添加元素;或者用入列操作添加元素,然後按照他們的優先級移除他們。
function PriorityQueue() {
let items = [];
// 設置添加元素的類
function QueueElement(element, priority) {
this.element = element;
this.priority = priority;
}
// 優先級添加
this.enqueue = function(element, priority) {
let queueElement = new QueueElement(element, priority);
let added = false;
// 遍原隊列中的元素,如果新添加元素的優先級的值(優先級大,priority值小)小於當前遍歷原始的優先級的值(即新添加元素優先級大於當前遍歷元素的優先級),則在其前面添加新的元素
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}`)
}
}
// 其他方法和默認的Queue實現方式相同
}
4.隊列的應用——擊鼓傳花🌹(循環隊列)
// nameList-參與的人 num-每輪傳🌹次數
function hotPotato(nameList, num) {
let queue = new Queue();
// 初始化隊列
for(let i=0; i<nameList.length; i++) {
queue.enqueue(nameList);
}
//
let eliminated = '';
// 進行循環隊列的入隊和出隊
while(queue.size() > 1) {
for(let i=0; i<num; i++) {
queue.enqueue(queue.dequeue);
}
// 傳花停止-淘汰隊列第一個
eliminated = queue.dequeue();
console.log(eliminated + '在擊鼓傳花🌹中被淘汰。')
}
// 最後一個出隊列的爲勝者🌹
return queue.dequeue();
}