美文网首页
自己动手写数据结构之循环队列

自己动手写数据结构之循环队列

作者: 逍遥白亦 | 来源:发表于2020-12-19 12:06 被阅读0次

循环队列的实现

1 定义

为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。

2 理解循环队列

image

如图所示,front为循环队列头指针,rear为循环队列尾指针。

初始状态为front == rear,队列为空

每次入队一个元素,rear+1,当队列满时,front == rear,同队列为空时一样,故而无法区分队列为空还是满。

所以采取空闲一个单元格,令队满特征为 front = (rear +1)%size

3 动手实现

思路

队列头 front

队列尾 rear

队列长度 size

入队(rear + 1)%size

出队(front + 1)%size

队列空 front == rear

队列满 (rear + 1)%size == front

public class CircleQueue<E> {

    private E[] circleQueueArray;

    private int front;

    private int rear;

    private int size;

    public CircleQueue(){
        this(10);
    }

    @SuppressWarnings("unchecked")
    public CircleQueue(int size) {
        this.circleQueueArray = (E []) new Object[size + 1];
    }

    boolean enQueue(E data) throws Exception {
        if (isFull()){
            throw new Exception("The Queue is full");
        }

        circleQueueArray[rear] = data;

        rear = (rear + 1) % circleQueueArray.length;

        size++;

        return true;

    }

    public E deQueue() throws Exception{
        if (isEmpty()){
            throw new Exception("The Queue is empty");
        }

        E data = getFront();

        circleQueueArray[front] = null;

        front = (front + 1)%circleQueueArray.length;

        size--;

        return data;
    }

    public int getSize(){
        return size;
    }

    private E getFront() throws Exception {
        if (isEmpty()){
            throw new Exception("The Queue is empty");
        }
        return circleQueueArray[front];
    }

    private boolean isEmpty(){
        return rear == front;
    }

    private boolean isFull(){
        return (rear + 1) % circleQueueArray.length == front;
    }
}

相关文章

  • 自己动手写数据结构之循环队列

    循环队列的实现 1 定义 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称...

  • leetcode622.设计循环队列

    题目链接 题解: 在我的文章数据结构之——队列与循环队列 中,有关于循环队列的设计,包括本题没有考虑过的resiz...

  • 数据结构-队列(Queue)-FIFO

    数据结构-队列(Queue)-FIFO 队列的接口设计 双端队列-Deque 循环队列-CircleQueue 双...

  • [Leetcode 622]设计循环队列

    设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之...

  • LeetCode 622. 设计循环队列

    622. 设计循环队列 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原...

  • java.util.ArrayDeque源码解析

    准备知识 因为ArrayDeque使用了循环队列,所以首先要了解循环队列数据结构的原理。https://www.j...

  • 自己动手写数据结构之普通队列

    普通队列的实现 1 定义 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表...

  • 常见的数据结构

    常见的数据结构有: 数组 链表单链表、双向链表、循环链表、双向循环链表、静态链表 栈顺序栈、链式栈 队列普通队列、...

  • 2018-08-01 js栈与队列补充

    栈与队列之js(ts)手写(补充)

  • 数据结构与算法——队列之循环队列

    队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,在表的后端进行插入操作。插入操作的端称为队尾,...

网友评论

      本文标题:自己动手写数据结构之循环队列

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