您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

一文搞懂队列

时间:2020-06-23 10:19:24  来源:  作者:

概念

队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。

和栈一样,队列是一种操作受限制的线性表。队列是先进先出(FIFO)的。进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列和栈非常相似,栈有入栈出栈两个基本操作操作,队列也有两个基本操作:入队(enqueue),把数据放到队尾。出队(dequeue),从队头取出一个数据。

队列出队和入队的时间复杂度都是O(1)。

顺序队列

用数组实现的队列叫做顺序队列

// 用数组实现的队列
public class ArrayQueue {
    // 数组:arr,数组大小:len
    private String[] arr;
    private int len = 0;
    // front 队头下标,rear 队尾下标
    private int front = 0;
    private int rear = 0;


    // 创建一个数组
    public ArrayQueue(int length) {
        items = new String[length];
        n = length;
    }

    // 入队
    public boolean enqueue(String item) {
        // 队列已满
        if (rear == len) return false;
        items[rear] = item;
        rear++;
        return true;
    }

    // 出队
    public String dequeue() {
        // 队列为空
        if (front == rear) return null;
        String result = items[front];
        front++;
        return result;
    }
}

队列有两个指针一个是front指向队头,一个是rear指向队尾。

如a、b、c、d、e 入列后,队头指针指向是的下标为0的位置,队尾指针指向的是下标为6的位置。

一文搞懂队列

 

然后不断进行出列和入列的操作,两个指针也不断往后移动,当队尾指针到达最右边的位置,就算数组中还有一个空闲的空间,但也没有办法继续向队列中加数据了。

回想数组空间不足,进行扩容,迁移数据的操作。

同理在这里也要对队列进行数据搬迁,只要在入列的时候判断一下 (rear == len )队列尾是已经到最后的话就进行数据迁移,然后重新计算两个指针的指向,然后再入列就可以了。

一文搞懂队列

 

链式队列

用链表实现的队列叫做链式队列。同样需要两个指针,队头指向第一个节点,队尾指向最后一个节点。

入队:rear -> next = newnode , rear = rear -> next

出队:front = front-> next

循环队列

用数组实现队列的时候,如果 rear == len ,就需要进行数据迁移操作。

为了避免进行数据迁移操作,可以用循环队列来解决。

循环队列首尾相接。

队空条件:front == rear

队满条件:(rear + 1) % len = front

确定好上面的两个条件,代码实现就很容易了。

一文搞懂队列

 


一文搞懂队列

 

阻塞队列

在队列的基础上增加了阻塞操作。

队列为空,队头取数据阻塞,等队列中有数据才会返回数据。

队列已满,队尾插数据阻塞,等队列中有空闲位置再插入数据。

其实这就是「生产者 - 消费者模型」,还可以通过配置多个「消费者」来对应一个「生产者」。

一文搞懂队列

 

并发队列

在多线程情况下,会有多个线程访问队列,会存在线程安全问题。

线程安全的队列叫做并发队列

通过在 enqueue() 、dequeue() 加锁来实现。



Tags:队列   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
TCP握手的时候维护的队列 半连接队列(SYN队列) 全连接队列(accepted队列)半连接队列是什么?服务器收到客户端SYN数据包后,Linux内核会把该连接存储到半连接队列中,并响应SYN+ACK报...【详细内容】
2021-12-21  Tags: 队列  点击:(10)  评论:(0)  加入收藏
前言栈和队列是一对好兄弟,前面我们介绍过一篇栈的文章(栈,不就后进先出),栈的机制相对简单,后入先出,就像进入一个狭小的山洞,山洞只有一个出入口,只能后进先出(在外面的先出去,堵...【详细内容】
2021-09-16  Tags: 队列  点击:(67)  评论:(0)  加入收藏
在Linux上做网络应用的性能优化时,一般都会对TCP相关的内核参数进行调节,特别是和缓冲、队列有关的参数。很多文章会告诉你需要修改哪些参数,但我们经常是知其然而不知其所以然...【详细内容】
2021-06-11  Tags: 队列  点击:(114)  评论:(0)  加入收藏
Redis的 list 数据结构常用来作为 异步消息队列 使用,使用 rpush/lpush 操作 入队 ,使用 lpop/rpop 来操作 出队 > rpush my-queue apple banana pear(integer) 3> llen my-qu...【详细内容】
2021-04-15  Tags: 队列  点击:(165)  评论:(0)  加入收藏
队列比较队列队列比较总结:就性能而言,无锁(什么也不加) > CAS > LOCK;从现实使用中考虑,我们一般选择有界队列(避免生产者速度过快,导致内存溢出);同时,为了减少Java的垃圾回收对系...【详细内容】
2020-12-15  Tags: 队列  点击:(136)  评论:(0)  加入收藏
1、 查找Docker容器中的RabbitMQ镜像docker ps -a[root@linux ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED...【详细内容】
2020-11-27  Tags: 队列  点击:(222)  评论:(0)  加入收藏
队列与堆栈类似,只是插入点与移除点不同。我们在队列的一端添加,从另一端移除。这一次,我们称之为先进先出(FIFO)。就像你能想到的任何队列一样,例如在餐厅、迪厅或者当你在等待进...【详细内容】
2020-11-17  Tags: 队列  点击:(68)  评论:(0)  加入收藏
在之前的线程池的介绍中我们看到了很多阻塞队列,这篇文章我们主要来说说阻塞队列的事。 阻塞队列也就是 BlockingQueue ,这个类是一个接 口,同时继承了 Queue 接口,这两个接口...【详细内容】
2020-11-16  Tags: 队列  点击:(57)  评论:(0)  加入收藏
背景“生产者和消费者模型” 是多线程通信的典型案例,本章节将利用前一节的锁和条件队列的知识,来实现一个完整的有界缓冲区,并创建多个线程访问该有界缓冲区,模拟生产者提供数...【详细内容】
2020-11-10  Tags: 队列  点击:(118)  评论:(0)  加入收藏
今天就从Linux源码的角度看下Server端的Socket在进行listen的时候到底做了哪些事情(基于Linux 3.10内核),当然由于listen的backlog参数和半连接hash表以及全连接队列都相关,在...【详细内容】
2020-11-04  Tags: 队列  点击:(156)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(11)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(22)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(14)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯·奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(40)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条