数据结构与算法--队列(Queue)--JS

104 阅读2分钟

数据结构与算法--队列(Queue)--JS

队列(Queue)

是一种受限的线性表,先进先出(FIFO, First In First Out),只能在前端进行删除操作,在后端进行插入操作

队列的实现和栈一样,有两种方案:

基于数组的实现、基于链表的实现

//封装队列类
function Queue() {
    //属性
    this.items = [];
    //方法
    //1.将元素加入到队列中
    Queue.prototype.enqueue = function (element) {
        this.items.push(element);
    }
    //2.从队列中删除前端元素
    Queue.prototype.dequeue = function () {
        return this.items.shift();
    }
    //3.查看前端的元素
    Queue.prototype.front = function () {
        return this.items[0];
    }
    //查看队列是否为空
    Queue.prototype.isempty = function () {
        return this.items.length == 0;
    }
    //查看队列中的元素个数
    Queue.prototype.size = function () {
        return this.items.length;
    }
    //6.toString方法
    Queue.prototype.toString = function () {
        var resultStr = '';
        for (var i = 0; i < this.items.length; i++) {
            resultStr += this.items[i];
        }
        return resultStr;
    }
}
var queue = new Queue();
queue.enqueue('abd');
alert(queue);

示例:击鼓传花

班级玩一个游戏,所有学生围城一个圈,从某位同学受力开始向旁边同学传花,这个时候某个人在击鼓,鼓声一停,话在谁手里,谁获胜 修改游戏规则: 几个朋友一起玩一个游戏,围成一圈,开始数一个固定的数(其实也可以每次随意一个数),数到某个数字的人自动淘汰,最后剩下的这个人获胜,请问最后剩下的人原来在哪个位置上

function passGame(nameList, num) {
    var queue = new Queue();
    //将所有人依次加入到队列中
    for (var i = 0; i < nameList.length; i++) {
        queue.enqueue(nameList[i]);
    }
    //开始数数字
    while (queue.size() > 1) {
        //不是num的时候,重新加入到队列的末尾
        //是num的时候,将其从队列中删除
        //num数字之前的人重新放入到队列末尾
        for (var i = 0; i < num; i++) {
            queue.enqueue(queue.dequeue());
        }
        //num对应的这个人,直接从队列中删除掉
        queue.dequeue();
    }
    //获取剩下的那个人
    var endName = queue.front();
    return nameList.indexOf(endName);
}
var names = ['li', 'zhao', 'liu', 'ha'];
alert(passGame(names, 2));

优先级队列

在插入一个元素的时候会考虑该数据的优先级,和其他数据优先级进行比较,比较后,可以得出这个元素在队列中的正确的位置,其他处理方式和基本的队列一样 优先级队列主要考虑的问题: 1.每个元素不再只是一个数据,而且包含数据的优先级 2.在添加方式中,根据优先级放入正确的位置

//封装优先级队列
function PriorityQueue() {
    //在PriorityQueue内重新创建一个类:可以理解为内部类
    function QueueElement(element, priority) {
        this.element = element;
        this.priority = priority;
    }
    //封装属性
    this.items = [];
    //实现插入方法
    PriorityQueue.prototype.enqueue = function (element, priority) {
        //创建QueueElement对象
        var queueElement = new QueueElement(element, priority);
        //判断队列是否为空
        if (this.items.length == 0) {
            this.items.push(queueElement);
        } else {
            //标识符
            var added = false;
            for (var i = 0; i < this.items.length; i++) {
                if (queueElement.priority < this.items[i].priority) {
                    this.items.splice(i, 0, queueElement);
                    added = true;
                    break;
                }
            }
            if (!added) {
                this.items.push(queueElement);
            }
        }
    }
    //其他属性和正常队列一致
    //2.从队列中删除前端元素
    PriorityQueue.prototype.dequeue = function () {
        return this.items.shift();
    }
    //3.查看前端的元素
    PriorityQueue.prototype.front = function () {
        return this.items[0];
    }
    //查看队列是否为空
    PriorityQueue.prototype.isempty = function () {
        return this.items.length == 0;
    }
    //查看队列中的元素个数
    PriorityQueue.prototype.size = function () {
        return this.items.length;
    }
    //6.toString方法
    PriorityQueue.prototype.toString = function () {
        var resultStr = '';
        for (var i = 0; i < this.items.length; i++) {
            resultStr += this.items[i].element + '-' + this.items[i].priority + ' ';
        }
        return resultStr;
    }
}
var pq = new PriorityQueue();
pq.enqueue('abc', 111);
alert(pq);
pq.enqueue('dac', 200);
pq.enqueue('aff', 50);
alert(pq);

\