美文网首页
第五讲-队列

第五讲-队列

作者: 小妍妍说 | 来源:发表于2018-12-19 21:58 被阅读0次

队列:先进先出

基本操作:出队(enqueue)or入队(dequeue)

顺序队列和链式队列

用数组实现的队列叫做顺序队列,用链表实现的队列叫做链式队列。

顺序队列:

// 用数组实现的队列
public class ArrayQueue {
  // 数组:items,数组大小:n
  private String[] items;
  private int n = 0;
  // head 表示队头下标,tail 表示队尾下标
  private int head = 0;
  private int tail = 0;

  // 申请一个大小为 capacity 的数组
  public ArrayQueue(int capacity) {
    items = new String[capacity];
    n = capacity;
  }

  // 入队
  public boolean enqueue(String item) {
    // 如果 tail == n 表示队列已经满了
    if (tail == n) return false;
    items[tail] = item;
    ++tail;
    return true;
  }

  // 出队
  public String dequeue() {
    // 如果 head == tail 表示队列为空
    if (head == tail) return null;
    // 为了让其他语言的同学看的更加明确,把 -- 操作放到单独一行来写了
    String ret = items[head];
    ++head;
    return ret;
  }
}

对于栈来说,只需要一个栈顶指针,

对于队列来说,需要一个head指针指向对头,需要一个tail指针指向队尾。


然而呢,随着不停地出队入队操作,head和tail都会持续的往后移动,当tail移到最后时,即使数组中还有空闲空间,也无法继续入队了,为了解决这个问题,可以当tail==n时进行数据迁移,另一个更好的办法是使用循环队列

1545227147333.png

实现循环队列最重要的是确定好队空和队满的判定条件。

在用数组实现的非循环队列中,队满tail == n,队空是 head == tail。

循环队列队满tail==n,队空(tail+1)%n=head

可以发现:当队列满时,图中的 tail 指向的位置实际上是没有存储数据的。所以,循环队列会浪费一个数组的存储空间。

队列的应用

阻塞队列:在队列基础上增加了阻塞操作。简单来说,就是在队列为空的时候从队头取数据会被阻塞。因为此时还没有数据可取,直到队列中有了数据才能返回;如果队列已经满了,那么插入数据的操作就会被阻塞,直到队列中有空闲位置后再插入数据,然后再返回。

相关文章

  • 第五讲-队列

    队列:先进先出 基本操作:出队(enqueue)or入队(dequeue) 顺序队列和链式队列 用数组实现的队列叫...

  • 数据结构与算法第五讲 - 队列

    本讲内容 队列的定义队列的操作队列的实现队列的应用 思考题:当我们向固定大小的线程池中请求一个线程时,如果线程池中...

  • 消息队列学习笔记

    《消息队列必知必会》是极客时间上一门课程,总共5讲,以下为学习笔记。 第一讲,为什么需要消息队列 消息队列是古老的...

  • 18-1-23

    第五讲

  • GCD 个人理解

    看GCD精讲(Swift 3&4)做的笔记 gcd 让开发人员由面向线程编程编为面向队列编程。 队列: 同步队列、...

  • Python队列的三种队列实现方法

    今天讲一下队列,用到一个python自带的库,queue 队列的三种实现方法有: 1、FIFO先入先出队列(Que...

  • python中队列的应用:约瑟夫斯问题

    著名的约瑟夫斯问题(Josephus Problem)是应用队列(确切地说,是循环队列)的典型案例。约瑟夫斯问题讲...

  • 如何插入队列时数据均匀排布

    需求:假设有n条队列,讲数据入队列时,需要散列一下。 id为业务唯一标识 index就是要放入队列的索引

  • Python学习教程:用队列实现栈

    接着上一期跟大家说的用栈实现队列,这期的Python学习教程跟大家讲用队列实现栈 题目:使用队列实现栈的下列操作:...

  • flutter 异步任务队列

    队列概念描述 我所讲的任务队列,是指异步的任务队列,而不是代码从上至下顺序执行后的按序执行任务.简单讲几个需求的场...

网友评论

      本文标题:第五讲-队列

      本文链接:https://www.haomeiwen.com/subject/qibskqtx.html