用JavaScript实现队列

开发 前端
在本文中,我将描述队列数据这个结构:它都有哪些操作以及在 JavaScript 中怎样实现。

作为一个优秀的程序猿需要具有知识的广度。首先是要了解你选择的编程语言。

然而在熟悉了编程语言之后,你还必须了解如何根据任务轻松且有效地操纵数据。这就是数据结构的用武之地。

[[389963]]

在本文中,我将描述队列数据这个结构:它都有哪些操作以及在 JavaScript 中怎样实现。

1. 队列数据结构

如果你喜欢四处旅行,肯定在火车站经历过检票这道手续。如果有很多人要坐火车,那么很自然地会形成一个队列。刚进入车站的人加入队列。另一边刚刚通过检票的人从队列中走出。这就是队列的一个例子,与队列数据结构的操作方式相同。

队列是一种遵循先入先出(FIFO)规则的数据结构。第一个进入队列中的项目(输入)是第一个出队(输出)的。

队列有2个指针:队首和队尾。最先进入队列进行排队的项目位于队首,而最后进入队列的项目位于队尾。

回顾车站的例子,第一个检票的是在队列的队首。刚进入队列的人在队尾。

队列数据结构

从更高的层面来看,队列是一种允许你按照先后顺序处理项目的数据结构。

2. 队列的操作

队列支持 2 个主要操作:入队(enqueue)和出队(dequeue),另外还有 peek 和 length 操作。

2.1 入队操作

入队操作在队列的尾部插入项目,使其成为队列的队尾。

入队操作

上图中的入队操作在队尾插入了 8,之后 8 成为队列的队尾。

  1. queue.enqueue(8); 

2.2 出队操作

出队操作取出队列中第一个项目,此时队列中的下一个项目成为队首。

出队操作

在上图中,出队操作返回项目7并从队列中删除。出队之后之后,项目 2 成为新的队首。

  1. queue.dequeue(); // => 7 

2.3 Peek 操作

Peek 操作读取队首的项目,但是不改变队列。

Peek 操作

上图中 7 是队首。peek 操作只需返回队首 7 但是不修改队列。

  1. queue.peek(); // => 7 

2.4 length

length 操作返回队列中包含项目的数量。

Length 操作

上图中的队列有 4 项:4、6、2 和。7。结果队列长度为 4。

  1. queue.length; // => 4 

2.5 队列操作的时间复杂度

关于队列所有操作的重点:enqueue,dequeue,peek 和 length 必须以常数时间复杂度 O(1) 执行。

常数时间复杂度 O(1) 意味着无论队列大小如何(不管是有 10 个还是 100 万个项目),这些操作都必须在相对一致的时间内执行。

3. 用 JavaScript 实现队列

来看一下怎样在保证所有操作必须以常数时间复杂度O(1) 要求实现队列这种数据结构。

  1. class Queue { 
  2.   constructor() { 
  3.     this.items = {}; 
  4.     this.headIndex = 0
  5.     this.tailIndex = 0
  6.   } 
  7.  
  8.   enqueue(item) { 
  9.     this.items[this.tailIndex] = item; 
  10.     this.tailIndex++; 
  11.   } 
  12.  
  13.   dequeue() { 
  14.     const item = this.items[this.headIndex]; 
  15.     delete this.items[this.headIndex]; 
  16.     this.headIndex++; 
  17.     return item; 
  18.   } 
  19.  
  20.   peek() { 
  21.     return this.items[this.headIndex]; 
  22.   } 
  23.  
  24.   get length() { 
  25.     return this.tailIndex - this.headIndex; 
  26.   } 
  27.  
  28. const queue = new Queue(); 
  29.  
  30. queue.enqueue(7); 
  31. queue.enqueue(2); 
  32. queue.enqueue(6); 
  33. queue.enqueue(4); 
  34.  
  35. queue.dequeue(); // => 7 
  36.  
  37. queue.peek();    // => 2 
  38.  
  39. queue.length;    // => 3 

const queue = new Queue() 是创建队列的实例。

queue.enqueue(7) 方法将 7 存入队列中。

queue.dequeue() 从队列中取出一个头部项目,而 queue.peek() 只读队首项。

最后的 Queue.Length 显示队列中还有多少个项目。

关于实现:在 Queue 类中,普通对象 this.Items 将队列的项目通过数值索引保持。队首项的索引由 Where.HeadInex 跟踪,队尾项由 this.tailIndex 跟踪。

队列方法的复杂度

在 Queue 的 queue()、 dequeue()、 peek() 和 length() 方法中存在:

  • 属性访问器(如:this.items[this.headIndex]),
  • 执行算数操作(如:this.headidex++)

这些方法的时间复杂度是恒定的时间 O(1)。

4. 总结

队列是一种遵循先入先出(FIFO)规则的的数据结构。

队列有 2 个主要操作:入队和出队。另外,队列可以有辅助操作,例如 peek 和 length。

所有队列操作都必须以常数时间 O(1) 执行。

挑战一下:改进 dequeue() 和 peek() 方法,当在空队列上执行时会抛出错误。

 

责任编辑:赵宁宁 来源: 前端先锋
相关推荐

2022-08-11 08:03:43

队列

2009-04-20 10:09:46

C#优先队列.NET Framew

2021-03-01 23:31:48

队列实现栈存储

2021-03-29 08:01:20

JavaScript数据结构

2021-09-08 09:52:34

语言

2011-02-21 12:52:00

JavaScript

2011-06-27 13:57:42

JavaScript

2009-09-11 10:44:07

JavaScript实

2020-08-13 06:56:57

Javascript插件前端

2021-08-30 07:49:32

Javascript西瓜视频

2021-04-05 14:48:51

JavaScriptjQuery函数

2021-06-25 10:38:05

JavaScript编译器前端开发

2020-11-30 06:20:13

javascript

2023-12-07 12:59:46

C语言循环队列代码

2021-01-28 18:06:49

JavaScriptCookieWeb

2023-09-05 15:48:14

RabbitMQ延迟队列

2023-10-10 13:39:53

Spring队列优化

2022-10-21 14:21:46

JavaScript笔记技能

2023-12-05 13:46:09

解密协程线程队列

2017-04-12 10:02:21

Java阻塞队列原理分析
点赞
收藏

51CTO技术栈公众号