棧和隊列算法題(基於JavaScript數組)

這是我參與8月更文挑戰的第4天,活動詳情查看:8月更文挑戰算法

棧和隊列

  • 基於數組

優先級隊列

即由插入元素的優先級來決定它的位置,而不是按照元素進出的順序排列的。所以元素在插入的時候,還有一個優先級數決定這個元素應該被插到哪裏。應用:就好比咱們生活中有時候會說女士優先、男士優先等,這些都是優先級的體現。數組

插入元素步驟:markdown

  • 封裝元素和優先級放在一塊兒(封裝一個新的構造函數)數據結構

    function QueueElement(element, priority) {
        this.element = element;
        this.priority = priority;
    }s
    複製代碼
  • 添加元素的時候,將新插入元素的優先級和隊列中已經存在的元素優先級進行比較,獲取這個元素的位置。函數

    當這個隊列中沒有元素,或者插入的元素的優先級都比隊列中的元素靠後的,直接push到隊列中便可。post

    splice是一種數組方法。splice(t,v,s)t: 被刪除元素的起始位置v: 被刪除元素個數s: 被插入的新元素this

    splice(i, 0, queueElement)表示把queueElement插入到第i個元素後一位。0表示被刪除元素個數爲0.spa

PriorityQueue.prototype.enqueue = function (element, priority) {
    var queueElement = new QueueElement(element, priority);
    if (this.items.length == 0) {
        this.items.push(queueElement);
    } else {
        var added = false;
        for (let i = 0; i < this.items.length; i++) {
            if (queueElement.priority < this.items[i].priority) {
                this.items.splice(i, 0, queueElement);
                added = true;
            }
        }
        if (!added) {
            this.items.push(queueElement);
        }
    }
}
複製代碼

算法題

  1. 擊鼓傳花prototype

    題目:n我的,從第一我的開始,數到m時這我的就被淘汰,接着下一我的從1開始數起。直到最後剩的那一我的獲勝。code

    這個題目用隊列的方式能夠很容易的作出來。以前在洛谷刷到過這道題,那時候還沒學到數據結構,如今看卻是容易許多。首先把n我的放到一個隊列中,當尚未數到m時,隊頭元素變成隊尾元素,當數到m時,隊頭元素被淘汰(刪除),這樣子循環下去,最後獲得的結果就是那個獲勝的元素。

    function Queue() {
        this.items = [];
        // 將元素加入到隊列中
        Queue.prototype.enqueue = function (e) {
            this.items.push(e);
        }
        // 刪除第一個元素
        Queue.prototype.dequeue = function () {
            return this.items.shift();
        }
    }
     
    function passGame(name, num) {
        let queue = new Queue();
        for (let i = 0; i < name.length; i++) {
            queue.enqueue(name[i]);
        }
        while (queue.items.length > 1) {
            for (let i = 0; i < num - 1; i++) {
                queue.enqueue(queue.dequeue(name[i]));
            }
            queue.dequeue(name[0]);
        }
        let endName = queue.items[0];
        console.log(endName);
    }
    let nameList = ['Lily', 'Mannqo', 'Ytao', 'mama']
    passGame(nameList, 6);
    複製代碼
  2. 整數反轉

    這道題我是用了數組的方式(棧的思想),由於棧的元素是先進後出的,我這裏把所給的數字轉換爲字符串以後一個一個壓入棧中,而後再把它一個一個取出來,再轉換爲數字。好比把1,2,3分別壓入棧中,此時的棧頂就是3,順序出棧的結果就是3,2,1;最後再根據題目要求返回對應值。

    整數反轉.png

    var reverse = function (x) {
        let arr = [];
        let str = x + '';
        let str2 = '';
        for (let i = 0; i < str.length; i++) {
            arr.push(str[i]);
        }
        for (let i = 0; i < str.length; i++) {
            str2 += arr.pop();
        }
        let num = parseInt(str2);
        if (num < -Math.pow(2, 31) || num > Math.pow(2, 31) - 1) {
            return 0
        } else if (str[0] == '-') {
            return -num;
        } else {
            return num;
        }
    };
    複製代碼

望大佬們多多指教orz,孩子會好好學的好好學的...

相關文章
相關標籤/搜索