栈和队列算法题(基于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,孩子会好好学的好好学的...

相关文章
相关标签/搜索