Javascriptでキューを実現します.

22962 ワード

githubホームページ:https://github.com/A15162252289
行列とは
キューは、FIFO(First In First Out)原則に従う順序付けされたセットのアイテムである.キューに新しい要素を追加し、上から要素を削除します.新しく追加した要素は列の最後に並べなければなりません.コンピュータ科学では、よくある例として、印刷キューがあります.例えば、私たちは5つの文書を印刷したいです.文書ごとに開けて、印刷ボタンをクリックします.各文書は印刷キューに送信されます.最初の印刷キューに送信すると優先的に印刷されます.すべてのドキュメントが印刷されるまで、1回で類推されます.
どうやって列を実現しますか
  • 構築関数を用いてキュー
  • を実現する.
    function Queue () {
        let 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.size = function () {
            return items.length; //       
        };
    }
    
    実用化:
    let queue = new Queue();
    queue.isEmpty(); //true
    queue.enqueue(2); //    2
    queue.size(); //1
    queue.dequeue(); //    2
    
    2.***ES 6**クラスを使ってキューを実現する
    let Queue2 = (function () {
        const items = new WeakMap();
        class Queue2 {
            constructor () {
                items.set(this, []);
            }
            enqueue (element) {
                let q = items.get(this);
                q.push(element); //         
            }
            dequeue () {
                let q = items.get(this);
                let t = q.shift();
                return t; //               
            }
            front () {
                let q = items.get(this);
                return q[0]; //           
            }
            isEmpty () {
                let q = items.get(this);
                return q.length === 0; //        
            }
            size () {
                let q = items.get(this);
                return q.length; //       
            }
        }
        return Queue2;
    })();
    
    3.優先キューの実現:
    function PriorityQueue () {
        let items = [];
        function QueueElement (element, priority) {
            this.element = element;
            this.priority = priority;
        }
        this.enqueue = function (element, priority) {
            let queueElement = new QueueElement(element, priority); //      
            let added = false;
            items.forEach((item, index) => {
                if (queueElement.priority < item.priority) {
                    items.splice(index, 0, queueElement);
                    added = true;
                    return false;
                }
            }); //      ,      queueElement    ,  queueElement       ,    
            if (!added) {
                items.push(priority);
            }
        };
        //    
    }
    
    4.循環キューの実現:
    //    ----    
    function hotPotato (nameList, num) {
        if (!(nameList instanceof Array)) {
            throw new Error('          nameList');
        }
        if (typeof num !== 'number') {
            throw new Error('         ');
        }
        let queue = new Queue(); //     
        nameList.forEach(item => {
            queue.enqueue(item);
        });
        let eliminated = ''; //        
        while (queue.size() > 1) {
            for (let i = 0; i < num; i++) {
                queue.enqueue(queue.dequeue());
            }
            eliminated = queue.dequeue(); //       
            console.log(eliminated + ' is out');
        }
        let winner = queue.dequeue();
        console.log('winner is ' + winner);
    }
    
    実用化:
    let nameList = [1, 2, 3, 4, 5, 6, 7];
    let num = 5;
    hotPotato(nameList, num);
    //     :
    // 6 is out
    // 5 is out
    // 7 is out
    // 2 is out
    // 1 is out
    // 4 is out
    // winner is 3
    
    Githubソースコード:link.