队列结构

184 阅读1分钟

受限的线性结构

另外一种受限的线性结构:栈结构

这种受限的数据结构对于解决某些特定问,会有特别的效果

还有一种受限的数据结构:队列

队列(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)