美文网首页
数组环形队列

数组环形队列

作者: lsh的学习笔记 | 来源:发表于2020-04-26 11:21 被阅读0次

规定:

head 指向队列第一个元素;
tail 指向队列最后一个元素的后一个位置。

public class ArrayCircularBlockQueue<E> {
    /**
     * 存储数据的数组
     */
    private final Object[] items;
    /**
     * 队列大小
     */
    private final int capacity;
    /**
     * 队列头下标
     */
    private int head;
    /**
     * 队列尾下标
     */
    private int tail;

    public ArrayCircularBlockQueue(int capacity) {
        this.capacity = capacity;
        this.items = new Object[capacity];
    }

    public boolean enqueue(E data) {
        boolean full = (tail + 1) % capacity == head;
        // 队满
        if (full) {
            return false;
        }
        else {
            items[tail] = data;
            // 队尾指针后移
            tail = (tail + 1) % capacity;
            return true;
        }
    }

    public E dequeue() {
        // 队空
        if (head == tail) {
            return null;
        }
        else {
            // 取出队头数据
            E item = (E) items[head];
            // 队头指针后移
            head = (head + 1) % capacity;
            return item;
        }
    }
}
环形队列.gif

几个问题

1. 为什么计算指针的时候要取模capacity?

如图所示capacity = 8,下标只有0到7,取模的含义实际上就是求余数余数就是除不尽被除数的剩余,永远小于被除数。

比如 a / 10,那么余数永远在0-9之间,余数=0表示整除、刚开始。

如此,以尾指针为例,

  • 开始的时候下标为0,也就相当于整除了,0除以8,余数为0;
  • 入队一个数据,下标变成1,1除以8,余数为1;
  • 出队一些数据,入队一些数据之后,当tail从7往0移动的时候,7+1=8,除以capacity余数刚好为0。

即:

取模capacity,表示已经走过 n 个完整的周期,现在是第 n+1 个周期的第几步。

可以类比时间,每天 24 小时,现在是第几天的 2 点?

2. 为什么要空一个?

因为当 head = tail 时,不知道是处于队空还是队满,无法识别。
所以用 (tail + 1) % capacity 来表示如果再增加入队一个,就像时间一样,head已经1时,tail 如果此时处于24时,(tail +1)%24 =1。

相关文章

  • 数组实现环形队列

    利用数组结构在队列的基础下用取模算法来实现环形队列。 环形队列拥有复用功能。 主要算法思想:1)front指向队列...

  • 数据结构之队列

    什么是队列 队列是一个有序列表, 可以用数组或链表实现 先入先出 使用数组模拟队列和环形队列 用数组模拟队列 思路...

  • 数组环形队列

    规定: head 指向队列第一个元素;tail 指向队列最后一个元素的后一个位置。 几个问题 1. 为什么计算指针...

  • 数据结构

    稀疏数组 代码实现: 队列 代码实现: 环形队列 什么时候队列满:(rear+1)%maxsize == fron...

  • workQueue有以下七种选择

    : ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列(数组结构可配合指针实现一个环形队列)。...

  • 数组模拟环形队列

    思路 代码 package com.atguigu.queue; import java.util.Scanner...

  • 数组模拟环形队列

  • 数组实现环形队列

    我这里实现的是循环队列 front:指向第一个数据的位置rear:指向最后一个数据的下一个位置maxSize:数组...

  • 稀疏数组 & 环形队列

    一、稀疏数组 1、是什么?比如有一个 11 * 11 的五子棋盘,我们要用程序模拟,那肯定就是二维数组。然后用1表...

  • 数组模拟队列和环形队列

    方式均根据先进先出的思想,按照双指针的方式实现;首先指针一 rear 代表了队列尾端,每新增一个数据则放置在队列尾...

网友评论

      本文标题:数组环形队列

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