美文网首页Web 前端开发
JS中的栈、队列和链表 -- 队列

JS中的栈、队列和链表 -- 队列

作者: 断桥百晓生 | 来源:发表于2018-08-13 15:12 被阅读0次

栈和队列是数据结构里的基本概念之一。所以今天讨论的内容是如何在JavaScript中实现一个队列。

什么是队列

顾名思义,就是排队的意思。之前看《JS高级编程》时里面好像举了一个买电影票的例子,我们排队买票,第一个人买完了票从队伍的最前面离开,新来的人要站在队伍的最后一个。

所以,在数据结构语言中,队列是一个动态的集合:其中新元素将被插入到队列的末尾(入队 ENQUEUE);并且要从队列的头部删除元素(出队 DEQUEUE);同时EnQueue和DeQueue是队列结构需要支持的两个主要操作。

删除的操作基于FIFO(先进先出)原则,先一步入队的元素必须先一步出队。

举一个作业调度的例子。

队列

这样的调度方式确保了任何工作都不会被遗忘或者等待太久。

如何在JS里使用队列

在JS中实现Queue的最简单的方法是将数组作为容器存储。使用Array.shift()方法可以移除并返回第一个元素,简单但并不高效。因为:

  • shift()的时间复杂度是O(n),n是队列的长度,但是DeQueue()的目标运行时间应为O(1)
  • Array.prototype里的大部分操作的时间复杂度都是O(n)
  • 数组是索引集合,所有的数据都被分配到内存中。如果队列过大,则每次更改都将移动大块内存以使用索引来保持数组可访问。

从时间和准确性的角度上看,数组并不是最好的存储容器,那么有比数组更好的存储容器吗?对象。JS里的一切不都是对象吗?

代码实现

  • 队列的基本结构
function Queue(){
  // 声明一个对象作为队列的存储容器
  // 声明头尾两端的索引值
}
  • EnQueue的实现
EnQueue: function(item){
  // 将入队的值分配一个尾部索引
  // 尾部的索引值递增
}
  • DeQueue的实现
DeQueue: function(){
  // 检查队列是否为空
  // 获取当前的头部索引指向的值
  // 删除数组头部元素
  // 将下一个索引变为头部索引

  // 为空则重置, 确保头尾索引不会过大

  // 返回删除的值
}
function Queue(){
  let storage = {},
    top = 0,
    end= 0;

  return {
    enQueue: function(item){
      storage[end] = item;
      end++;
    },
    deQueue: function(){
      let size = end - top;

      if (size <= 0) return undefined;

      let item = storage[top];
      delete storage[top];
      top++;

      if (top === end){
        top = 0;
        end = 0;
      }

      return item;
    },
    size: function(){
      return end - top;
    },
    peek: function(){
      return storage[end - 1];
    },
    print: function(){
      let result = [];

      for (let key in storage){
        result.push(storage[key]);
      }

      return result;
    }
  }
}

现在,访问Object的属性需要O(1)时间,因此EnQueue和DeQueue方法每个都将花费固定的时间,不会因队列大小的变化而变化。

相关文章

  • JS中的栈、队列和链表 -- 队列

    栈和队列是数据结构里的基本概念之一。所以今天讨论的内容是如何在JavaScript中实现一个队列。 什么是队列 顾...

  • 数据结构与算法之数组与链表

    线性表包括数组,链表(单链表,双向链表,循环链表,双向循环链表,静态链表),栈(顺序栈,链式栈),队列(普通队列,...

  • 数据结构与算法之栈与队列

    线性表包括数组,链表(单链表,双向链表,循环链表,双向循环链表,静态链表),栈(顺序栈,链式栈),队列(普通队列,...

  • 常见的数据结构

    常见的数据结构有: 数组 链表单链表、双向链表、循环链表、双向循环链表、静态链表 栈顺序栈、链式栈 队列普通队列、...

  • 队列 - Queue

    基本概念 队列和栈类似,不同的是,先进队列的元素,最先从队列出去。 实现 通过链表实现队列 Java中,队列是一个...

  • js实现单链表、队列、栈

    单链表 队列 栈

  • 基础算法学习与实践

    数组&链表 1. 快慢指针的方式实现判断链表是否有环 栈和队列 1. 栈实现队列(负负得正) ...

  • 算法导论 基本数据结构

    MIT公开课没有讲到的内容,介绍几种基本数据结构- 栈和队列- 链表- 二叉树 栈和队列 栈和队列都是动态集合,元...

  • 第四章_栈和队列_2019-03-20

    基本知识点 栈:先进后出,队列:先进先出 栈和队列都既能用数组实现,又能用链表实现 栈和队列的基本操作:pop()...

  • JavaScript⑦数组队列

    栈和队列: js中没有专门的栈和队列类型,都是用普通该数组模拟的。 何时: 只要希望按照顺序使用数组元素时 栈: ...

网友评论

    本文标题:JS中的栈、队列和链表 -- 队列

    本文链接:https://www.haomeiwen.com/subject/donkbftx.html