「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」
队列
介绍
队列 是数据结构的基本知识之一,在实际的项目中应用场景很多,这里做一个相关的总结。
队列 的示意图:
简介
队列 是 先进先出, 后进后出 的一种方式,例如生活中有很多的例子: 排队结账,排队取票,排队进游乐园等等,都是 先进先出 的生活应用。
队列 是在队尾 来进行 插入元素的操作,而在队顶 来进行 删除元素的操作。
队列 (Queue) 的操作方式有:
-
入队(enqueue)
在队尾 插入一个新的元素
-
出队(dequeue)
将队顶元素进行移除
-
返回队顶(front)
返回队顶的元素,但不移除
-
队列是否为空(isEmpty)
判断队列里是否为空
-
队列中元素数量(size)
返回 队列 里面元素的数量
-
清空(clear)
清空队列内所有的元素
代码
class Queue {
constructor() {
this.arr = [10,20,30]
}
enqueue(element) {
this.arr.push(element)
}
dequeue() {
return this.arr.shift()
}
front() {
if (this.isEmpty()) return null
return this.arr[0]
}
isEmpty() {
return this.arr.length === 0
}
size() {
return this.arr.length
}
find(index) {
return this.arr[index]
}
clear() {
this.arr = []
}
}
const queue = new Queue()
queue.enqueue(12)
console.log(queue.arr)
console.log(queue.dequeue())
console.log(queue.arr)
console.log(queue.front())
console.log(queue.arr)
console.log(queue.isEmpty())
console.log(queue.arr)
console.log(queue.size())
console.log(queue.arr)
console.log(queue.find(1))
console.log(queue.arr)
queue.clear()
console.log(queue.arr)
得到的结果为:
[ 10, 20, 30, 12 ]
10
[ 20, 30, 12 ]
20
[ 20, 30, 12 ]
false
[ 20, 30, 12 ]
3
[ 20, 30, 12 ]
30
[ 20, 30, 12 ]
[]
例子
经典的 队列 来解决的例子
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
输入: nums = [1,3,-1,-3,5,3,6,7], k = 3
输出: [3,3,5,5,6,7]
注意这道题主要在,如何判断里面的最大值,和每次入队前,先判断是否超出,超出则先出队,再入队。循环比较得到最大值,最后在进行push最大值到 结果数组中。
结果代码
class Queue {
constructor() {
this.arr = []
}
enqueue(element) {
this.arr.push(element)
}
dequeue() {
return this.arr.shift()
}
front() {
if (this.isEmpty()) return null
return this.arr[0]
}
isEmpty() {
return this.arr.length === 0
}
size() {
return this.arr.length
}
find(index) {
return this.arr[index]
}
clear() {
this.arr = []
}
}
const queue = new Queue()
const nums = [1, 3, -1, -3, 5, 3, 6, 7, 1, 1, 1]
const maxSlidingWindow = (nums, k) => {
const res = []
const numsLength = nums.length
if (k > numsLength || k <= 0) return []
for (let i = 0; i < numsLength; i++) {
// 先删除离开窗口的元素
if (queue.front() === nums[i - k]) queue.dequeue()
// 进行入队操作
queue.enqueue(nums[i])
// 若 index+1 小于 数组里的值,且队列里 index 下标的值 小于 将要传入的值时
let index = 0
let temp = queue.front()
while (index + 1 < queue.size()) {
if (queue.find(index) < queue.find(index + 1)) {
temp = queue.find(index + 1)
}
index++
}
// 推入最大值
if (i >= k - 1) res.push(temp)
}
return res
}
总结
队列 是基础的数据结构,它的一个方式是 先进先出 。
-
队尾 插入元素
-
队顶 删除元素。