1.队列结构
- 是一种受限的线性结构
- 特点:先进先出
2.使用JS实现
// 自定义队列
function Queue() {
var items = []
// 队列操作的方法
// enter queue方法
this.enqueue = function (element) {
items.push(element)
}
// delete queue方法
this.dequeue = function () {
return items.shift()
}
// 查看前端的元素
this.front = function () {
return items[0]
}
// 查看队列是否为空
this.isEmpty = function () {
return items.length == 0
}
// 查看队列中元素的个数
this.size = function () {
return items.length
}
}
3.使用TS实现
class ArrayQueue<T>{
//创建一个数组用于存储
private arr:T[]=[]
enqueue(e: T): void {
this.arr.push(e)
}
dequeue(): T | undefined {
return this.arr.shift()
}
peek(): T | undefined {
return this.arr[0]
}
isEmpty(): boolean {
return this.arr.length===0
}
size(): number {
return this.arr.length
}
}
export default ArrayQueue
4.相关题目
4.1 击鼓传花
import ArrayQueue from "./01-实现队列结构"
function hotPotato(arr:string[],num:number):number{
if(arr.length===0)return-1
//创建队列
const queue=new ArrayQueue<string>()
//把所有项添加到队列里
for(let i=0;i<arr.length;i++){
queue.enqueue(arr[i])
}
//当队列里剩下一个时终止循环,即size大于1的时候继续循环
while(queue.size()>1){
//第num前的出列再入列(从第一个开始,这个循环表示出列入列次数,数数从第一个开始数)
for(let i=1;i<num;i++){
const name=queue.dequeue()
if(name) queue.enqueue(name)//因为出列的有可能为undefined
}
//第num个出列不再入列
queue.dequeue()
}
//return queue.dequeue() //返回的是值。此时就剩下一个
const index=arr.indexOf(queue.dequeue()!)//有可能为undefined所以加个!(断言此时一定有值)
return index
}
4.2 约瑟夫环
类似击鼓传花
import ArrayQueue from "./01-实现队列结构"
function lastRemaining(n:number,m:number){
const queue=new ArrayQueue<number>()
for(let i=0;i<n;i++){
queue.enqueue(i)
}
while(queue.size()>1){
for(let i=1;i<m;i++){
queue.enqueue(queue.dequeue()!)
}
queue.dequeue()
}
return queue.dequeue()
}