主要特点
- 受限的线性表
- 先进先出(FIFO)
- 只允许在队尾插入
- 只允许在队首删除
场景
- 电影院等场所排队
- 打印队列
-
- 比如有五分文档要打印,打印机会依次放入,先放的会先打印出来
- 线程队列
-
- 若让大量线程同时运行会占用过多资源
- 这时候可以用线程队列,依此让线程执行
队列封装
- enqueue(element) 向队尾添加元素
- dequeue() 移除队首元素并返回移除的元素
- front() 返回队首元素
- isEmpty() 判断队列是否为空
- size() 返回元素个数
- toString() 将队列内容输出
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>队列的封装</title>
</head>
<body>
<script type="text/javascript">
// 队列封装
function Queue() {
this.items = []
// 队尾添加
Queue.prototype.enqueue = function (element) {
this.items.push(element)
}
// 队首移除
Queue.prototype.dequeue = function() {
return this.items.shift()
}
// 访问队首
Queue.prototype.front = function() {
return this.items[0]
}
// 队列大小
Queue.prototype.size = function() {
return this.items.length;
}
// 判断队空
Queue.prototype.isEmpty = function() {
return this.size() === 0
}
// 输出队列
Queue.prototype.toString = function() {
let res = ''
for (var i = 0; i < this.size(); i++) {
res += this.items[i] + ','
}
console.log(res)
}
}
let queue = new Queue()
queue.enqueue(1)
queue.enqueue(2)
queue.enqueue(3)
queue.enqueue(4)
queue.toString()
queue.dequeue()
queue.toString()
</script>
</body>
</html>
题目一:击鼓传花
几个人围成一圈,开始数数,数到某个数字那个人自动淘汰
依此类推,最后剩的人为赢家
function intoQue(queue,num) {
// 将要被淘汰掉的人之前的人重新入队
let count = 1;
while (count < num) {
queue.enqueue(queue.dequeue())
count++
}
return queue
}
function losePerson(queue,num) {
// 2、不断淘汰人,使最后只剩下一个人并将它返回
while(queue.size() > 1) {
queue = intoQue(queue,num)
queue.dequeue()
}
return queue.front()
}
function allInQueue(nameList) {
// 1、所有成员入队列,最后返回队列
let queue = new Queue()
for(let i = 0;i < nameList.length;i++) {
queue.enqueue(nameList[i])
}
return queue
}
function passGame(nameList,num) {
// 所有人入队
let queue = allInQueue(nameList)
// 不断进行淘汰人,最终返回剩下的一个人
return losePerson(queue,num)
}
console.log(passGame(['Tom','Jack','Lucy','Joy'],3))
- 先用allInQueue函数将所有成员入队
- 再用losePerson方法淘汰一个个成员
- 淘汰时每次都要把即将被淘汰的成员前面的成员入队尾
- 再淘汰队首的成员
- 直到队列中还剩下一个成员,则将这个成员返回