第三页 队列学习

队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序的项 队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。

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

     //创建一个自己的队列
        function MyQueen() {
            //这里是属性和方法
            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());
            };
        }
        var queue = new MyQueen();
        console.log(queue.isEmpty()); //输出true
        //向队列添加
        queue.enqueue("John");
        queue.enqueue("Jack");
        queue.enqueue("Camila");
        queue.print();//队列数组转换字符串
        console.log(queue.size()); //输出3
        console.log(queue.isEmpty()); //输出false
        queue.dequeue();//移除第一个进来的  然后下面输出Jack,Camila
        queue.print();

 

优先队列:元素的添加和移除是基于优先级的。一个现实的例子就是机场登机的顺序。头等舱和商务舱乘客的优先级要高于经济舱乘客。在有些国家,老年人和孕妇(或带小孩的妇女)登机时也享有高于其他乘客的优先级。

    //优先队列
        function PriorityQueue() {
            var items = [];
            this.isEmpty = function () {
                return items.length == 0;
            };
      
            //{1}: 要向PriorityQueue添加元素,需要创建一个特殊的元素这个元素包含了要添加到队列的元素(它可以是任意类型及其在队列中的优先级。
            function QueueElement(element, priority) { //{1} 创建新元素
                this.element = element;
                this.priority = priority;//表示优先级
            }
            this.enqueue = function (element, priority) {//入队列
                var queueElement = new QueueElement(element, priority);
                if (this.isEmpty()) {// {2} 如果队列为空 添加元素
                    items.push(queueElement); 
                } else {//否则,就需要比较该元素与其他元素的优先级。
                    var added = false;//添加标识
                    for (var i = 0; i < items.length; i++) {//遍历这个队列数组的所有元素,
                        if (queueElement.priority < items[i].priority)
                        {
                            items.splice(i, 0, queueElement); // {3} 一旦找到priority值更大的元素,就插入新元素
                            //数组的splice()的方法 在i索引位置开始,删除后面0个元素,插入元素
                            added = true;
                            break; // {4} 终止for循环
                        }
                    }
                    if (!added) { //{5} 如果要添加元素的priority值大于任何已有的元素,把它添加到队列的末尾就行了
                        items.push(queueElement);
                    }
                }
                this.print = function () {
                    var str = '';
                    if (!this.isEmpty()) {
                        //for (var i = 0; i < items.length; i++) {
                        //    str += items[i].element + "_" + items[i].priority+"--";
                        //}
                        str += items[0].element + "_" + items[0].priority ;
                    }
                    console.log(str);
                };
            };
            //其他方法和默认的Queue实现相同
        }
        var priorityQueue = new PriorityQueue();
        priorityQueue.enqueue("John", 2);  //[John,2]
        priorityQueue.enqueue("Jack", 1);// [Jack,1],[John,2]
        priorityQueue.enqueue("Camila", 1);// [Jack,1],[Camila,1],[John,2]
        priorityQueue.print();// 输出 Jack_1

 

posted @ 2018-07-19 17:47  前行。。。  阅读(143)  评论(0编辑  收藏  举报