热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript实现循环队列(非Array.prototype.pop和Array.prototype.shift)

循环队列优点重用浪费的内存例:[1,2,3,4]-deQueue-[null,2,3,4]-deQueue-[null,null,3,4]优于数组已满,无法从队尾将新元素



循环队列优点


重用浪费的内存

例: [1,2,3,4] -> deQueue -> [null, 2,3,4] -> deQueue -> [null,null,3,4]

优于数组已满,无法从队尾将新元素入队,因此用循环队列来重新利用被浪费的空间




功能

MyCircularQueue(k): 构造器,设置队列长度为 k 。

Front: 从队首获取元素。如果队列为空,返回 -1 。

Rear: 获取队尾元素。如果队列为空,返回 -1 。

enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。

deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。

isEmpty(): 检查循环队列是否为空。

isFull(): 检查循环队列是否已满。

changeHeadPoint(): 移动头指针。

changeTailPoint(): 移动尾指针。




思路

一般来说,利用Javascript实现队列可用Array.prototype.pop()和Array.prototype.shift()来实现入队和出队,但是为了表现循环队列的优点,即可以重复利用普通队列浪费的空间,此处定义一个空数组,并利用头指针和尾指针的移动来实现循环队列




代码

MyCircularQueue类

var MyCircularQueue = function(k) {
this.queue = new Array(k)
for(let i = 0;i this.queue[i] = null
}
this.head = -1
this.tail = -1
};
MyCircularQueue.prototype.enQueue = function(value) {
if (!this.isFull()) {
// 改变尾指针后入队
this.changeTailPoint()
this.queue[this.tail] = value
return true
} else {
return false
}
};
MyCircularQueue.prototype.deQueue = function() {
if (!this.isEmpty()) {
// 出队后改变头指针
this.queue[this.head] = null
this.changeHeadPoint()
return true
} else {
return false
}
};
MyCircularQueue.prototype.FrOnt= function() {
if(!this.isEmpty()) {
return this.queue[this.head]
} else {
return -1
}
};
MyCircularQueue.prototype.Rear = function() {
if(!this.isEmpty()) {
return this.queue[this.tail]
} else {
return -1
}
};
MyCircularQueue.prototype.isEmpty = function() {
return this.head === -1 && this.tail === -1
};
MyCircularQueue.prototype.isFull = function() {
return this.queue.indexOf(null) === -1
};
MyCircularQueue.prototype.changeHeadPoint = function() {
// 是否剩下一个元素
if(this.head === this.tail) {
this.head = -1
this.tail = -1
} else {
this.head++
// 边界
if(this.head === this.queue.length) {
this.head = 0
}
}
}
MyCircularQueue.prototype.changeTailPoint = function() {
// 空数组入队
if(this.tail === -1 && this.head === -1) {
this.tail++
this.head++
} else {
this.tail++
// 边界
if(this.tail === this.queue.length) {
this.tail = 0
}
}
}
MyCircularQueue.prototype.show = function() {
console.log('queue: ', this.queue)
console.log('front: ', this.head)
console.log('rear: ', this.tail)
}

调试

let queue = new MyCircularQueue(6)
queue.enQueue(2)
queue.enQueue(2)
queue.enQueue(2)
queue.enQueue(2)
queue.enQueue(2)
queue.enQueue(2)
queue.deQueue()
queue.deQueue()
queue.enQueue(2)
queue.show()

调试结果:

queue: [ 2, null, 2, 2, 2, 2 ]

front: 2

rear: 0



推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
author-avatar
miya的发现王国sGA_998
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有