1. 程式人生 > >第三頁 隊列學習

第三頁 隊列學習

dequeue emp ron turn out 學習 console for 新的

隊列是遵循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

第三頁 隊列學習