队列

github

队列遵循先进先出的原则的一种有序的项。

  1. enqueue(): 向队列尾部添加一个(或多个)新的项
  2. dequeue(): 移除队列的第一(即排在队列最前面的)项,并返回被移除的元素
  3. front(): 返回队列中第一个元素--最先被添加,也将是最先被移除的元素。队列不做任何变动(不移除元素,只返回元素信息--与Stack类的peek方法非常相似)。
  4. isEmpty(): 如果队列中不包含任何元素,返回true,否则返回false
  5. size(): 返回队列包含的元素个数,与数组的length属性相似

目录

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./queue.js"></script>
</head>

<body>

</body>

</html>
复制代码

queue.js

var Queue = function() {
    var items = [];
    //入队
    this.enqueue = function(el) {
            items.push(el)
        }
        //出队
    this.dequeue = function() {
            return items.shift();
        }
        // 队头
    this.front = function() {
            return items[0]
        }
        //队是否为空
    this.isEmpty = function() {
            return items.length === 0;
        }
        //队的长度
    this.size = function() {
        return items.length;
    }
}

复制代码

实例化

queue-es6.js

class Queue {
    constructor() {
        this.items = [];
    }

    enqueue = function(el) {
            this.items.push(el)
        }
        //出队
    dequeue = function() {
            return this.items.shift();
        }
        // 队头
    front = function() {
            return this.items[0]
        }
        //队是否为空
    isEmpty = function() {
            return this.items.length === 0;
        }
        //队的长度
    size = function() {
        return this.items.length;
    }
}
复制代码

队列实现击鼓传花

玩家列表 ['a', 'b', 'c', 'd', 'e', 'f'];,每第三个出队,最后只留下一个

var Queue = function() {
    var items = [];
    //入队
    this.enqueue = function(el) {
            items.push(el)
        }
        //出队
    this.dequeue = function() {
            return items.shift();
        }
        // 队头
    this.front = function() {
            return items[0]
        }
        //队是否为空
    this.isEmpty = function() {
            return items.length === 0;
        }
        //队的长度
    this.size = function() {
        return items.length;
    }
}

var chuanhua = function(names, number) {
        var q = new Queue();
        for (var i = 0; i < names.length; i++) {
            q.enqueue(names[i])
        }

        var taotal;
        while (q.size() > 1) { //q.size() == 1 时,停止
            for (var i = 0; i < number - 1; i++) { //number=3,只循环2次
                q.enqueue(q.dequeue())  //1.先把a出队,然后入队, 2.把b出队,然后入队
            }
            taotal = q.dequeue(); //c
            console.log('淘汰玩家是:' + taotal)
        }
    }
//玩家列表
var names = ['a', 'b', 'c', 'd', 'e', 'f'];
//游戏规则
var number = 3;

chuanhua(names, number)
复制代码

优先队列

常景: 银行vip办理业务要优先于普通客户

priorityQueue.js

var PriorityQueue = function() {
    var items = [];

    //辅助类
    var QueueItem = function(el, priority) {
        this.el = el;
        this.priority = priority
    }

    this.enqueue = function(el, priority) {
        var queueItem = new QueueItem(el, priority);

        var added = false;
        for (var i = 0; i < items.length; i++) {
            if (queueItem.priority > items[i].priority) {
                items.splice(i, 0, queueItem);
                added = true;
                break;
            }
        }
        if (!added) {
            items.push(queueItem);
        }
    }
    this.getItems = function() {
        return items;
    }
}
复制代码

实例化

1.红色 实例化 2. 入队 3. 查看队列

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐