JavaScript技术总结--队列

队列

先进先出, 类似排队,数组实现

function Queue() {
    var items = [];
    //向尾部添加
    this.enqueue = function(element) {
        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.print = function() {
        console.log(items.toString());
    }
}
1、优先队列:

要改变的是 添加元素时,要考虑权重,如下权重小的在前

 function PriorityQueue() {
        var items = [];
        
        // {1}
        function QueueElement(element, priority) {
            this.element = element;
            this.priority = priority;
        }
        
        this.enqueue = function(element, priority) {
            var queueElement = new QueueElement(element, priority);
            
            if(this.isEmpty()) {//空队列直接插入
                items.push(queueElement);  // {2}
            } else {
                var added = false;
                for(var i = 0; i < items.length; i++) {//从前往后找一个比自己权重大的
                    if(queueElement.priority < items.[i].priority) {
                        items.splice(i, 0, queueElement);    // {3}
                        added = true;
                        break;
                    }
                }
                if(!added) {    // {4}
                    items.push(queueElement);
                }
            }
        }
        
        // 其他方法与默认队列一样
     }
2、循环队列:

几个孩子围成一圈,开始击鼓了,孩子就把花尽快地传递给旁边的人,某一时刻鼓声停止了,传花也就停止了,这个时候花落在谁手上,谁就被淘汰。鼓声响起,继续传花,如此循环,直至只剩下一个孩子,即胜者。

function hotPotato(namelist, num) {
    var queue = new Queue();
    for (var i = 0; i < namelist.length; i++) {     // 把名单添加到队列里面
        queue.enqueue(namelist[i]);
    }
    var eliminated = "";
    while (queue.size() > 1) {                 // 当队列的的长度大于1的时候(行{2}),
        for (var i = 0; i < num; i++) {
            queue.enqueue(queue.dequeue());    // 根据num迭代队列,将队列头移除并添加到队尾。
        }
        eliminated = queue.dequeue();    // 传递次数达到给定的数字,则删除此时的队列第一项
        console.log(eliminated + "在击鼓传花游戏中被淘汰");
    }
    return queue.dequeue();    // 如此循环,直至队列的长度等于1,返回胜者
}
var names = ['john', 'jack', 'camila', 'ingrid', 'carl'];
var winner = hotPotato(names, 7);
console.log("胜利者: " + winner);      //john
发布了15 篇原创文章 · 获赞 4 · 访问量 1241

猜你喜欢

转载自blog.csdn.net/qq_37152533/article/details/101476785