js高級進階之數據結構“隊列”的實現

像棧一樣,隊列也是一種線性表。它允許在表的一端插入數據,在另一端刪除元素。插入元素的這一端稱之爲隊尾。刪除元素的這一端我們稱之爲隊首。隊列的結構如下圖所示。

隊列的特性:

  • 在隊尾插入元素,在隊首刪除元素。
  • FIFO(先進先出),和食堂排隊打飯一樣。

在這裏插入圖片描述
es5 實現

function Queue(){
        var temps = [];
        //隊列的插入
        this.insert = function(e){
            if(e){
                temps.push(e);
            }
        }
        //隊列的刪除
        this.remove = function(){
           return temps.shift();
        }
        //獲取隊列的長度
        this.getSize = function(){
            return temps.length;
        }
        //清除隊列
        this.clear = function(){
            temps = [];
        }
        //獲取隊列的第一個元素
        this.getFront  = function(){
            if(temps.length>0){
                return temps[0]
            }else{
                return null;
            }
        }
        //判斷隊列是否爲空
        this.isEmpty = function(){
            return temps.length == 0;
        }

        // 打印隊列內的所有元素
        this.print = function () {
            console.log(temps.toString());
        };
    }

測試:

 //====================================測試=============================

    let queue = new Queue();
    console.log(queue.isEmpty()); // true

    console.log("向隊列插入數據:郭,張,劉"); 
    //向隊列插入數據
    queue.insert('郭');
    queue.insert('張');
    queue.insert('劉');
    console.log("當前隊列元素:"); 
    queue.print(); 
    console.log("當前隊列長度:"); 
    console.log(queue.getSize()); // 3
    console.log("當前隊首元素:"); 
    console.log(queue.getFront()); 
    console.log("執行隊列出隊操作"); 
    console.log(queue.remove()); 

    console.log("當前隊列元素:"); 
    queue.print(); 
    console.log("清空隊列"); 
    queue.clear();
    console.log(queue.getSize());
    

結果:
在這裏插入圖片描述

es6實現

let Queue = (function () {
    const items = new WeakMap();

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

        enqueue (element) {
            let q = items.get(this);
            if (element instanceof Array) items.set(this, q.concat(element));
            else q.push(element);
        };

        dequeue () {
            let q = items.get(this);
            return q.shift();
        };

        front () {
            return items.get(this)[0];
        };

        isEmpty () {
            return items.get(this).length === 0;
        };

        size () {
            return items.get(this).length;
        };

        clear () {
            items.set(this, []);
        };

        print () {
            console.log(items.get(this).toString());
        };
    }

    return Queue;
})();
發佈了77 篇原創文章 · 獲贊 8 · 訪問量 6874
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章