受限的线性结构
另外一种受限的线性结构:栈结构
这种受限的数据结构对于解决某些特定问,会有特别的效果
还有一种受限的数据结构:队列
队列(Queue)
它是一种受限的线性表,先进先出
受限之处在于他只允许在表的前端进行删除操作
而在表的后端进行插入操作
队列的实现和栈一样,有两种方案
基于数组实现
基于链表实现
队列有哪些常见的操作
enqueue(element):向队列尾部添加一个或多个新的项
dequeue():移除队列的第一项,并返回被移除的元素(排在队列最前面的)
front():返回队列中第一个元素——最先被添加,也就是最先被移除的元素,队列不做变动,只返回
isEmpty():如果队列中不包含任何元素,返回true,否则返回false
size():返回队列包含的元素个数,与数组的length类似
toString():将队列中的内容,转成字符串形式
// 封装队列类
class Queue {
// 属性
constructor() {
this.items = []
}
// 方法
// 1.将元素加入队列中
enqueue(element) {
this.items.push(element)
}
// 2.从队列中删除前端元素
dequeue() {
return this.items.shift()
}
// 3.查看前端元素
front() {
return this.items[0]
}
// 4.查看队列是否为空
isEmpty() {
return this.items.length === 0
}
// 5.查看队列中元素的个数
size() {
return this.items.length
}
// 6.toString方法
toString() {
let res = ''
for (let i = 0; i < this.items.length; i++){
res += this.items[i] + ' '
}
return res
}
}
面试题:使用队列实现击鼓传花
// 面试题: 击鼓传花
function passGame(nameList,num){
// 1.创建队列结构
let queue = new Queue()
// 2.将所有人加入到队列中
for (let i = 0; i < nameList.length; i++){
queue.enqueue(nameList[i])
}
// 3.开始数数
while (queue.size() > 1){
// 不是num的时候,重新加入队列后端
// 是nun的时候,将其从队列中删除
// 3.1 num数字之前的人 将其放到队列后端
for (let i = 0; i < num - 1; i++){
queue.enqueue(queue.dequeue())
}
// 3.2 num对应这个人直接删除
queue.dequeue()
}
// 4.获取剩下的那个人
console.log(queue.size())
console.log(queue.front())
console.log(nameList.indexOf(queue.front()))
}
passGame(['a','b','c','d','e','f','g'],4)