当前位置: 首页 > article >正文

数据结构-04-队列

1-队列的结构和特点

       生活中我们排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进者先出,这就是典型的"队列"。队列跟栈非常相似,支持的操作也很有限,最基本的操作也是两个:入队enqueue(),放一个数据到队列尾部;出队dequeue(),从队列头部取一个元素。

  比如我们依次入队列元素A-B-C-D,如下图所示:

比如我们依次出队列元素A-B-C,如下图所示:

       所以队列跟栈一样,也是一种操作受限的线性表数据结构。队列的应用也非常广泛,特别是一些具有某些额外特性的队列,比如循环队列、阻塞队列、并发队列。它们在很多偏底层系统、框架、中间件的开发中,起着关键性的作用。比如高性能队列Disruptor、Linux环形缓存,都用到了循环并发队列;Java concurrent并发包利用ArrayBlockingQueue来实现公平锁等。

2-队列的实现

      队列可以用数组来实现,也可以用链表来实现。用数组实现的栈叫作顺序栈,用链表实现的栈叫作链式栈。同样,用数组实现的队列叫作顺序队列,用链表实现的队列叫作链式队列。下面是利用数组实现简易版的队列,里面优化点有很多,大家可以自行实现。

public class MyArrayQueue {
    private Object[] elementData;//存储元素的数组
    private int capacity;//容量
    private int head;//队列的头部下标
    private int tail;//队列的尾部下标

    public MyArrayQueue(int capacity) {
        this.elementData = new Object[capacity];
        this.capacity = capacity;
        this.head = 0;
        this.tail = 0;
    }

    // 入队操作
    public boolean enqueue(Object item) {
        // 数组空间不够了,直接返回false,入队失败。
        if (tail == capacity){
            return false;//这个是简单实现---不涉及到数据,满了直接返回,下标不移动
        }
        // 将item放到下标为count的位置,并且count加一
        elementData[tail] = item;
        ++tail;
        return true;
    }

    // 出队操作
    public Object dequeue() {
        // 如果head == tail 表示队列为空
        if (head == tail) return null;
        // 返回下标为count-1的数组元素,并且栈中元素个数count减一
        Object tmp = elementData[head];
        ++head;
        return tmp;
    }
}

Jdk源码中也有队列相关的,其中Queue接口,

public interface Queue<E> extends Collection<E>

还有一些高级队列,比如阻塞队列,双端队列,并发队列等等。

3-队列的使用

      在实际的业务开发过程中,我们很少自己开发一个队列来实现业务的需求;直接使用sdk中封装好的各种高级队列来满足我们业务需求。比如阻塞队列,并发队列,环状队列;以及我们熟知线程池中,我们对过多的任务也会放进我们使用的高级队列中。


http://www.kler.cn/a/152335.html

相关文章:

  • 单片机AVR单片机病房控制系统设计+源程序
  • 阶段三:Web开发(学习如何使用Cookie和Session进行用户认证)
  • POJ P1088动规的三种解法
  • Android系统源码中添加可编译运行执行程序,java
  • 使用 TypeScript 改进异步操作和错误处理的策略
  • 【上海大学数字逻辑实验报告】一、基本门电路
  • 【虚拟机】Docker基础 【二】
  • EI级 | Matlab实现TCN-LSTM-Multihead-Attention多头注意力机制多变量时间序列预测
  • WP采集插件的进阶功能:输入关键词采集及定向采集实现精准筛选
  • 无mac电脑生成uniapp云打包私钥证书的攻略
  • webpack优化打包速度
  • 基于AT89C51单片机的节日彩灯门设计
  • Excel 使用技巧
  • 5年经验之谈 —— 接口测试主要测哪些方面?
  • 淘宝订单接口对接实战(续):高级功能与实战案例
  • Course1-Week3-分类问题
  • 使用JMeter安装RabbitMQ测试插件的步骤
  • Windows安装Opencv与VS配置
  • Google Chrome访问出现 NET::ERR_CERT_INVALID
  • 探讨几种在CentOS 7上实现文件上传的方法