美文网首页
数组实现队列之循环队列

数组实现队列之循环队列

作者: 吕艳凯 | 来源:发表于2019-12-06 11:03 被阅读0次

对于链表实现方式,队列的入队、出队操作和栈是大同小异的。但对于数组实现方式来说,因为数组的长度固定,队列的入队和出队操作有了一些有趣的变化。

队列为队尾入队,对头出队,但如果不断出队,对头的左边就会失去作用,如下图:


image.png

在数组不做扩容的前提下,如何让新元素入队并确定新的队尾位置呢?我们可以利用已出队元素留下的空间,让队尾指针重新指回数组的首位。


image.png
这样一来,整个队列的元素就“循环”起来了。在物理存储上,队尾的位置也可以在队头之前。当再有元素入队时,将其放入数组的首位,队尾指针继续后移即可。
image.png

一直到(队尾下标+1)%数组长度 = 队头下标时,代表此队列真的已经满了。需要注意的是,队尾指针指向的位置永远空出1位,所以队列最大容量比数组长度小1。


image.png
循环队列不但充分利用了数组的空间,还避免了数组元素整体移动的麻烦,还真是有点意思呢!至于入队和出队的时间复杂度,都同样是O(1)
具体代码实现:
private int[] array;
private int front;
private int rear;

public MyQueue(int capacity){
    this.array = new int[capacity];
}
/**
 * 入队
 * @param element 入队的元素
 */
public void enQueue(int element) throws Exception {
    if((rear+1)%array.length == front){
        throw new Exception(" 队列已满!");
    }
    array[rear] = element;
    rear =(rear+1)%array.length;
}

/**
* 出队
*/
public int deQueue() throws Exception {
    if(rear == front){
        throw new Exception(" 队列已空!");
    }
    int deQueueElement = array[front];
    front =(front+1)%array.length;
    return deQueueElement;
}

/**
* 输出队列
*/
public void output(){
    for(int i=front; i!=rear; i=(i+1)%array.length){
        System.out.println(array[i]);
    }
}

public static void main(String[] args) throws Exception {
    MyQueue myQueue = new MyQueue(6);
    myQueue.enQueue(3);
    myQueue.enQueue(5);
    myQueue.enQueue(6);
    myQueue.enQueue(8);
    myQueue.enQueue(1);
    myQueue.deQueue();
    myQueue.deQueue();
    myQueue.deQueue();
    myQueue.enQueue(2);
    myQueue.enQueue(4);
    myQueue.enQueue(9);
    myQueue.output();
}

相关文章

  • 1.数组队列

    数组实现单队列 数组实现循环队列

  • 有关“队列”的总结

    队列 定义 分类 链式队列 (用链表实现) 静态队列 (用数组实现)图静态队列通常都必须是循环队列循环队列的讲解:...

  • Java数组实现循环队列

    Java数组实现循环队列 上一节(Java实现队列——顺序队列、链式队列)我们使用数组实现了顺序队列,但是在tai...

  • 队列

    基于数组的循环队列 Java实现 基于链表的队列实现 Java实现

  • 用数组实现循环队列

    用数组实现循环队列!

  • 数组实现队列之循环队列

    对于链表实现方式,队列的入队、出队操作和栈是大同小异的。但对于数组实现方式来说,因为数组的长度固定,队列的入队和出...

  • 数据结构——队列

    目录 1、什么是队列 2、队列的实现 2.1、基于简单循环数组的实现 2.1.1、为什么需要循环数组 2.1.2、...

  • C队列(数组循环队列、链表普通队列)

    一、数组循环队列 简述一下思想,该循环队列用数组实现,数组大小初始化为5(MaxSize),有头索引(front)...

  • Java队列

    阻塞队列 ArrayBlockingQueue 一个用循环数组实现的有界阻塞队列。必须指定队列长度,按 FIFO(...

  • Java基础面试题

    如何用数组实现队列? 用数组实现队列时要注意 溢出 现象,这时我们可以采用循环数组的方式来解决,即将数组收尾相接。...

网友评论

      本文标题:数组实现队列之循环队列

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