数据结构队列概述

Posted 橘猫吃不胖~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构队列概述相关的知识,希望对你有一定的参考价值。

数据结构队列概述

1 认识队列

队列是受限的线性表,先进先出(FIFO,First In First Out),受限之处在于它只允许在表的前端进行删除操作,在表的后端进行插入操作。

在生活中队列结构也很常见,比如说排队的时候,某人先排队,那么他的问题就会被先解决,某人后来,他的问题就被后解决。

队列示意图:

队列有两种实现方案:①基于数组实现;②基于链表实现

2 队列的常见操作

  1. enqueue(element):向队列尾部添加一个(或多个)新的项。
  2. dequeue():移除队列的第一项(排在队列最前面的),并返回被移除的元素。
  3. front():返回队列中第一个元素——最先被添加,也是最先被移除的元素,队列不做任何变动。
  4. isEmpty():如果队列中不包含任何元素,返回true,否则返回false。
  5. size():返回队列包含的元素个数,与数组的length属性类似
  6. toString():将队列中的内容转成字符串形式

下面使用数组来实现队列的操作:

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.isEmpty = function () 
        return this.items.length == 0;
    

    // 查看队列中元素的个数
    Queue.prototype.size = function () 
        return this.items.length;
    

    // 将队列转化成字符串输出
    Queue.prototype.toString = function () 
        // 按照元素+空格+元素将其转化为字符串
        let result = "";
        for (let i = 0; i < this.items.length; i++) 
            result += this.items[i] + " ";
        
        return result;
    

3 击鼓传花实例

游戏规则:几个人一起玩游戏,围成一圈,这时规定了一个数字,从某个人开始数数,当数到该数字的人自动淘汰;剩下的人继续数该数字,当再次数到该数字时,这个人淘汰,以此类推,最后剩下的那个人获胜。

根据上面队列编写的方法再编写程序,输出获胜的人的姓名。

【实现思路】将玩游戏的人装在一个队列中,从第一个人开始数,如果某个人数到了这个给定的数字,则他被从队列删除,如果没有数到该数字,则将其排到队列的最后。

代码如下:

// 传入两个参数,玩游戏的人名单和给定的数字
function passGame(nameList, num) 
    // 创建一个队列
    let queue = new Queue();
    // 将所有人加入到队列中
    for (let i = 0; i < nameList.length; i++) 
        queue.enqueue(nameList[i]);
    
    // 循环数数,直到剩下最后一个人
    while (queue.size() > 1) 
        // 没有数到给定数字,将其排列到队列最后面
        for (let i = 0; i < num - 1; i++) 
            queue.enqueue(queue.dequeue());
        
        // 数到给定数字,这个人淘汰
        queue.dequeue();
    
    // 输出最后获胜的人
    console.log(queue.front());


let nameList = ["Tony", "Lucy", "Alice", "Bob", "Happy"];
passGame(nameList, 5);

程序结果:Lucy

4 优先级队列

优先级队列在插入一个元素时,会考虑该数据的优先级。该元素会与队列中其他元素进行比较,比较完成后,可以得出这个元素在队列中的正确的位置。

优先级队列在生活中也很常见,比如我们有一堆事情要处理,在时间比较紧迫的情况下,我们会优先处理时间比较紧而且比较重要的事情,不太重要的事情会往后推一推。

下面通过一个程序来实现优先级队列。实现优先级队列有两点要求:①封装元素时和优先级放在一起;②添加元素时,将新插入的元素的优先级和队列中已经存在的元素优先级进行比较,以获得自己的正确位置。

示例代码如下:

function PriorityQueue() 
    // 两个参数,一个是元素,一个是优先级
    function QueueElement(element, priority) 
        this.element = element
        this.priority = priority;
    
    // 封装属性
    this.items = [];
    // 实现插入方法
    PriorityQueue.prototype.enqueue = function (element, priority) 
        // 创建对象
        let queueElement = new QueueElement(element, priority);
        // 判断队列是否为空
        if (this.items.length == 0) 
            this.items.push(queueElement); // 将该元素直接添加到队列中
         else  // 如果队列不为空
            let added = false; // 标记队列中元素位置是否更改
            for (let i = 0; i < this.items.length; i++)  // 当前元素与队列中元素进行比较
                if (queueElement.priority < this.items[i].priority)  // 查找到位置
                    this.items.splice(i, 0, queueElement); // 将元素添加到自己的位置
                    added = true; // 标记队列元素更改
                    break; // 结束当前循环
                
            
            if (!added)  // 如果没有在队列中找到自己的顺序,表示该优先级最小
                this.items.push(queueElement); // 将其添加到队列末尾
            
        
    


let pq = new PriorityQueue();
// 为队列添加4个元素
pq.enqueue(2, 2);
pq.enqueue(16, 16);
pq.enqueue(9, 9)
pq.enqueue(1, 1);
// 输出排序后的队列
console.log(pq.items);

以上是关于数据结构队列概述的主要内容,如果未能解决你的问题,请参考以下文章

php+redis实现消息队列

数据结构队列概述

1.概述

js异步函数队列

RabbitMQ和Kafka对比,总结了以下几个点

数据结构:栈——在“尾巴”上搞事情