02-队列实现

104 阅读1分钟

主要特点

  • 受限的线性表
  • 先进先出(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方法淘汰一个个成员
  • 淘汰时每次都要把即将被淘汰的成员前面的成员入队尾
  • 再淘汰队首的成员
  • 直到队列中还剩下一个成员,则将这个成员返回