【前端】js实现队列功能 先进后出 先进先出 等
也可以定义一个定时器 不断的去取队列 执行任务 用一个flag定义队列正在执行中, 如果没有执行 则定时器不断的去调用队列,(因为会随时添加一个任务到队列中)
队列任务结束后 自动取下一个队列 也可以边加队列 边取
队列定义
function Queue() {//初始化队列(使用数组实现)var items = []//入队this.enqueue = function (ele) {items.push(ele)}//出队this.dequeue = function () {return items.shift()}//返回首元素this.front = function () {return items[0]}//队列是否为空this.isEmpty = function () {return items.length == 0}//清空队列this.clear = function () {items = []}//返回队列长度this.size = function () {return items.length}//查看列队this.show = function () {return items}
}var queue = new Queue();
queue.enqueue('hello');
queue.enqueue('world');
queue.enqueue('css');
queue.enqueue('javascript');
queue.enqueue('node.js');
console.log(queue.isEmpty()); // false
console.log(queue.show()); //hello,world,css3,javascript,node.js
console.log(queue.size()); //5
console.log(queue.front()); //hello
console.log(queue.dequeue()); //hello
console.log(queue.show()); //'world', 'css', 'javascript', 'node.js'
console.log(queue.clear());
console.log(queue.size()); //0
优先队列
function PriorityQueue() {//初始化队列(使用数组实现)var items = []//因为存在优先级,所以插入的列队应该有一个优先级属性function queueEle(ele, priority) {this.ele = elethis.priority = priority}//入队this.enqueue = function (ele, priority) {let element = new queueEle(ele, priority)//为空直接入队if (this.isEmpty()) {items.push(element)}else {var qeueued = false; //是否满足优先级要求,并且已经入队for (let i = 0; i < this.size(); i++) {if (element.priority < items[i].priority) {items.splice(i, 0, element)qeueued = truebreak;}}//如果不满足要求,没有按要求入队,那么就直接从尾部入队if (!qeueued) items.push(element)}}//出队this.dequeue = function () {return items.shift()}//返回首元素this.front = function () {return items[0]}//队列是否为空this.isEmpty = function () {return items.length == 0}//清空队列this.clear = function () {items = []}//返回队列长度this.size = function () {return items.length}//查看列队this.show = function () {return items}
}var priorityQueue = new PriorityQueue();
priorityQueue.enqueue('优先级2-1', 2);
priorityQueue.enqueue('优先级1-1', 1);
priorityQueue.enqueue('优先级1-2', 1);
priorityQueue.enqueue('优先级3-1', 3);
priorityQueue.enqueue('优先级2-2', 2);
priorityQueue.enqueue('优先级1-3', 1);
priorityQueue.show(); // 按优先级顺序输出//输出
[
0:queueEle {ele: "优先级1-1", priority: 1},
1:queueEle {ele: "优先级1-2", priority: 1},
2:queueEle {ele: "优先级1-3", priority: 1},
3:queueEle {ele: "优先级2-1", priority: 2},
4:queueEle {ele: "优先级2-2", priority: 2},
5:queueEle {ele: "优先级3-1", priority: 3}
]
循环队列
function Queue() {//初始化队列(使用数组实现)var items = []//入队this.enqueue = function (ele) {items.push(ele)}//出队this.dequeue = function () {return items.shift()}//返回首元素this.front = function () {return items[0]}//队列是否为空this.isEmpty = function () {return items.length == 0}//清空队列this.clear = function () {items = []}//返回队列长度this.size = function () {return items.length}//查看列队this.show = function () {return items}
}/*** * @param {名单} names * @param {指定传递次数} num */
function onlyOne(names, num) {var queue = new Queue()//所有名单入队names.forEach(name => {queue.enqueue(name)});//淘汰的人名var loser = ''//只要还有一个以上的人在,就一直持续while (queue.size() > 1) {for (let i = 0; i < num; i++) {//把每次出队的人,再次入队 ,这样一共循环了num 次(击鼓传花一共传了num次)queue.enqueue(queue.dequeue())}//到这就次数就用完了,下一个就要出队了loser = queue.dequeue()console.log(loser + '被淘汰了')}//到这就剩下一个人了return queue.dequeue()
}var names = ['文科', '张凡', '覃军', '邱秋', '黄景']
var winner = onlyOne(names, 99)
console.log('金马奖影帝最终获得者是:' + winner)