js資料結構--佇列(queue)

遨翔在知識的海洋裡發表於2019-01-07

佇列

github

佇列遵循先進先出的原則的一種有序的項。

  1. enqueue(): 向佇列尾部新增一個(或多個)新的項
  2. dequeue(): 移除佇列的第一(即排在佇列最前面的)項,並返回被移除的元素
  3. front(): 返回佇列中第一個元素--最先被新增,也將是最先被移除的元素。佇列不做任何變動(不移除元素,只返回元素資訊--與Stack類的peek方法非常相似)。
  4. isEmpty(): 如果佇列中不包含任何元素,返回true,否則返回false
  5. size(): 返回佇列包含的元素個數,與陣列的length屬性相似

js資料結構--佇列(queue)

目錄

js資料結構--佇列(queue)

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;
    }
}

複製程式碼

例項化

js資料結構--佇列(queue)

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'];,每第三個出隊,最後只留下一個

js資料結構--佇列(queue)

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)
複製程式碼

js資料結構--佇列(queue)

優先佇列

常景: 銀行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. 檢視佇列

js資料結構--佇列(queue)

相關文章