定义
队列是一种特殊的线性表,只能从头部删除元素,从尾部添加元素。
入队示意图
出队示意图
左侧是队首,右侧是队尾,元素只能从队尾入队,队首出队。
队列的实现
队列的基本方法
- enqueue 添加元素
- dequeue 删除元素
- head 查看头部元素
- tail 查看尾部元素
- size 返回队列大小
- clear 清空队列
- isEmpty 判断队列是否为空
function Queue() {
let items = []
this.enqueue = function (item){
items.push(item)
}
this.dequeue = function() {
return items.shift()
}
this.head = function() {
return items[0]
}
this.tail = function() {
return items[items.length - 1]
}
this.size = function() {
return items.length
}
this.clear = function() {
items = []
}
this.isEmpty = function() {
return !items.length
}
}
队列应用
约瑟夫环
有一个数组, 存放0 - 99 这个100个数,要求每隔两个数删除一个数, 到末尾时循环到开头继续进行,求最后一个被删除的数。
思路:
- 准备一个队列, 把数据入队
- while 遍历队列中的每一个元素,看第 n 个元素是否是 3 的倍数, 是则删除, 不是则入队。
- 直到队列中还剩一个元素
let arr = new Array(100).fill(1).map((_, j) => j) // 准备 100 个元素的数组
function de_ring(arr) {
let queue = new Queue()
for(let i = 0 ; i < arr.length; i++) {
queue.enqueue(i)
}
let index = 0
while(queue.size() > 1) {
const item = queue.dequeue()
i += 1
if(i % 3 !== 0) {
queue.enqueue(item)
}
}
return queue.dequeue()
}
del_ring(arr)