ES5
let items = [];
function Queue() {
//队列添加元素
this.enqueue = function (element) {
items.push(element);
}
//队列移除元素
this.dequeue = function () {
items.shift();
}
//查看队头元素
this.front = function () {
return items[0];
}
//队列是否为空
this.isEmpty = function () {
return items.length === 0;
}
this.size = function () {
return items.length;
}
this.print = function () {
console.log(items.toString());
}
}
ES6的WeakMap和闭包
let Queue = (function () {
const items = new WeakMap();
class Queue {
constructor() {
items.set(this, []);
}
enqueue(element) {
let q = items.get(this);
q.push(element);
}
dequeue() {
let q = items.get(this);
let r = q.shift();
return r;
}
front() {
let q = items.get(this);
return q[0];
}
isEmpty() {
let q = items.get(this);
return q.length === 0;
}
size() {
let q = items.get(this);
return q.length;
}
print() {
let q = items.get(this);
console.log(q.toString());
}
}
return Queue;
})()
测试数据:
let queue = new Queue();
console.log(queue.isEmpty());
queue.enqueue("Json");
queue.enqueue("js");
console.log(queue.size());
console.log(queue.isEmpty());
queue.dequeue();
queue.print();
优先队列---最小优先
function PriorityQueue() {
let items = [];
function QueueElement(element, priority) {
this.element = element;
this.priority = priority;
}
this.queue = 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.front = function () {
return items[0];
}
this.isEmpty = function () {
return items.length === 0;
}
this.size = function () {
return items.length;
}
//$
this.print = function () {
for (let i = 0; i < items.length; i++) {
console.log(`${items[i].element}-${items[i].priority}`);
}
}
}
let priorityQueue = new PriorityQueue();
priorityQueue.enqueue("JSON", 2);
priorityQueue.enqueue("JS", 1);
priorityQueue.enqueue("CSS", 1);
priorityQueue.print();
循环队列---击鼓传花
function hotPotato(nameList, num) {
let queue = new Queue();
for (let i = 0; i < nameList.length; i++) {
queue.enqueue(nameList[i]);
}
let eliminated = ''; //记录淘汰者
while (queue.size() > 1) {
for (let j = 0; j < num; j++) {
queue.enqueue(queue.dequeue()); //循环
}
eliminated = queue.dequeue();
console.log(eliminated + '在击鼓传花游戏中被淘汰');
}
return queue.dequeue();
}
let names = ['John', 'Jack', 'Camila', 'Ingrid', 'Carl'];
let winner = hotPotato(names, 7);
console.log('The winner is: ' + winner);