队列是一种遵从先进先出(FIFO)原则的有序集合 队列在尾部添加新元素,从顶部移除元素
队列的理解
队列在我们生活中最常见的场景就是排队了 队列这个名字也已经很通俗易懂了
队列的前面是队头 队列的后面是队尾 出队从队头出 入队从队尾入
队列的创建
和栈类似,这里我就不就不啰嗦了 同样需要实现一些功能 这里我类比生活中的排队上厕所
- 向队列中添加元素(进入排队的队伍中)
- 移除队头元素(队伍最前面的人出队进入厕所)
- 查看队头元素(查看队伍最前面的人)
- 判断队列是否为空(看看队伍中有没有人)
- 移除队伍全部元素(厕所炸了,都散了吧)
- 查看栈里元素个数(查看排队的有多少人)
于是我们可以创建一个完整队列实现,同样是利用我们的数组实现 数组头就是队列头
队列的使用
下面我们就用这个队列简单模拟排队
控制台打印:
优先队列
在我们排队上厕所的时候,来了一位拥有VIP会员卡的朋友,插到了队伍的最前面 过了一会儿又来了一位拥有SVIP会员卡的朋友,插到了VIP的前面
虽然这个比喻可能不恰当,但是生活中可能存在有优先级的队列 优先级高的人可以查到优先级低的人前面
这就是循环队列
如果优先值小的元素放到队列的前面,这叫做最小优先队列 反之优先值大的元素放到队列的前面,这叫做最大优先队列 但其实他们两个仅仅是一个判断的改变,实现方式是一样的 优先队列较普通队列的区别也就是入队要判断优先级,并且需要对我们的元素进行处理,其他方法不变 这处理也就是把元素包装为一个拥有优先级的对象 既然所有对象都有着同样的属性,那我们毫无疑问就应该使用工厂构建 我们可以稍微修改一下我们的队列类 来实现一个最小优先队列
解释我已经在代码里说的很明白 下面我们就用这个优先队列同样来模拟排队上WC
控制台打印:
循环队列
循环队列典型的例子击鼓传花 还记得在我上高中的时候我们晚自习一停电就玩这个 拿一个东西当“花”,轮着传,“鼓”一停,拿到花的同学就要站起来唱歌 可以把循环队列当作是队列的应用 下面我们来模拟实现循环队列击鼓传花
控制台输出:
以上就是JavaScript下的队列实现。 我们还简单理解了两个特殊的队列:优先队列与循环队列。