【数据结构】队列(Queue)

队列

基本概念

  • 定义:在表一端进行插入操作另一端进行删除操作的线性表。
  • 队头:插入操作
    队尾:删除操作
  • 特点先进先出

    (图源网络)

方法

  • enqueue:入列,向队列尾部增加一个元素
  • dequeue:出列,移除队列头部的一个元素并返回被移除的元素
  • front:获取队列的第一个元素
  • isEmpty:判断队列是否为空
  • size:获取队列中元素的个数

代码实现

//队列
function Queue() {
    var collection = [];
    //打印队列
    this.print = function() {
        console.log(collection);
    }

    //入队列(向队列尾部增加一个元素)
    this.enqueue = function(element) {
        collection.push(element);
    }

    //出队列(移除队头元素)
    this.dequeue = function() {
        return collection.shift();
    }

    //取队头元素
    this.front = function() {
        return collection[0];
    }

    //判断队列是否为空
    this.isEmpty() = function() {
        return collection.length === 0;
    }

    //获取队列中的元素个数
    this.size = function() {
        return collection.length;
    }
}

优先队列

基本概念

  • 定义:带有优先级的队列
  • 优先级:数值越小,优先级越高。
  • 特点:出队操作是把队列中优先级最高的元素出队列
  • 实现优先级高的元素入列时将排到低优先级元素之前(使用二维数组实现)

方法

  • enqueue:入列,按照优先级排序插入,优先级高的将排在优先级低的之前(即值小的排在值大的之前)
  • dequeue:出列,移除队列头部的一个元素并返回被移除的元素
  • front:获取队列的第一个元素
  • isEmpty:判断队列是否为空
  • size:获取队列中元素的个数

代码实现

//优先队列(给每个元素赋予优先级,优先级高的元素入列时将排到低优先级元素之前)
function PriorityQueue() {
    //优先队列采用二维数组存放值,每个元素第2个值为优先级,数值越小,优先级越高
    var collection = [];
    //打印队列
    this.print = function() {
        console.log(collection);
    }

    //入队列(优先级高的元素入列时将排到低优先级元素之前)【数值越低,优先级越高。因此是将值小的排到大的之前】
    this.enqueue = function(element) {
        if (this.isEmpty()) {
            collection.push(element);
        } else {
            var added = false;
            for (let i = 0; i < collection.length; i++) {
                if (element[1] < collection[i][1]) {
                    // 使用splice方法,实现将element添加到collection的第i个位置,即往前排
                    collection.splice(i, 0, element);
                    added = true;
                    break;
                }
            }
            if (!added) {
                collection.push(element);
            }
        }
    }

    //出队列(移除队头元素)
    this.dequeue = function() {
        return collection.shift();
    }

    //取队头元素
    this.front = function() {
        return collection[0];
    }

    //判断队列是否为空
    this.isEmpty = function() {
        return collection.length === 0;
    }

    //获取队列中的元素个数
    this.size = function() {
        return collection.length;
    }
}

//测试
var pQ = new PriorityQueue();
pQ.enqueue(['gannicus', 3]);
pQ.enqueue(['spartacus', 1]);
pQ.enqueue(['crixus', 2]);
pQ.enqueue(['oenomaus', 4]);
pQ.print();
全部评论

相关推荐

面试官全程关摄像头1.自我介绍一下2.React和Vue哪个更熟悉一点3.你在之前那段实习经历中有没有什么技术性的突破(我只是实习了44天工作28天,我把我能说的都说了)4.你封装的哪个表单组件支不支持动态传值5.自己在实习阶段Vue3项目封装过hook吗6.hook有什么作用7.Vue2和Vue3的响应式区别(我说一个是proxy是拦截所有的底层操作,Object.defineProperty本身就是一个底层操作,有些东西拦截不了,比如数组的一些操作还有等等,面试官就说实在要拦截能不能拦截????我心想肯定不行呀,他的底层机制就不允许吧)8.pinia和vuex的区别(这个回答不出来是我太久没用了)9.pinia和zustand的区别,怎么选(直接给我干懵了)(我说react能用pinia吗&nbsp;&nbsp;他说要用的话也可以)10.渲染一万条数据,怎么解决页面卡顿问题(我说分页、监听滚轮动态加载,纯数据展示好像还可以用canvas画)(估计是没说虚拟表单,感觉不满意)11.type和interface的区别12.ts的泛型有哪些作用(我就说了一个结构相同但是类型不同的时候可以用,比如请求响应的接口,每次的data不同,这里能用一个泛型,他问我还有什么)13.你项目用的是React,如果让你再写一遍你会选择什么14.pnpm、npm、yarn的区别15.dependencies和devdependencies的区别总而言之太久没面试了,上一段实习的面试js问了很多。结果这次js一点没问,网络方面也没考,表现得很一般,但是知道自己的问题了&nbsp;&nbsp;好好准备,等待明天的影石360和周四的腾讯了&nbsp;&nbsp;加油!!!
解zj:大三的第一段面试居然是这样的结局
查看15道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务