基于数组实现循环队列(基于Java实现)

本文介绍了如何使用Java实现循环队列,以解决数组实现队列时数据搬移导致的性能问题。循环队列利用数组的环状特性,避免了满队列时的数据移动,但会浪费一个数组空间。文章通过示例代码详细展示了循环队列的入队、出队操作,并分析了队空和队满的判断条件。此外,还讨论了循环队列在实际应用中的优缺点。
摘要由CSDN通过智能技术生成

title: 基于数组实现循环队列(基于Java实现)
tags: 数组 循环队列


基于数组实现循环队列的方法原理:

我们在用数组实现队列的时候,发现当tail = n时,就会有数据搬移的操作,这样一来入队操作的性能就会受到影响。那我们可以使用循环队列来解决这一问题。

循环队列,顾名思义,它长得像一个环。如下图所示:

我们可以看到,图中这个队列的大小为 8,当前 head=4,tail=7。当有一个新的元素 a 入队时,我们放入下标为 7 的位置。但这个时候,我们并不把 tail 更新为 8,而是将其在环中后移一位,到下标为 0 的位置。当再有一个元素 b 入队时,我们将 b 放入下标为 0 的位置,然后 tail 加 1 更新为 1。所以,在 a,b 依次入队之后,循环队列中的元素就变成了下面的样子:

通过上述的这种方法,就能够成功地避免数据搬移操作。但是要实现这个循环队列的代码难度比之前的非循环队列的代码实现要更难。其最为关键的是,确定好队空和队满的判定条件。

在循环队列中,你会发现队空的判断条件是:tail = head,而队满的条件是:(tail+1) % n = head。为什么队满的条件会是这个呢?其实你根据上述循环队列的插入删除操作,你就会发现当队列满的时候,tail和head之间是相邻,相差为1,又因为插入的时候,主要是在移动tail指针,所以它的队满的操作为(tail+1) % n = head。如下图,为一张队满的示意图:

具体实现代码如下:

package com.company;

public class CircularQueue {
    //数组:items,数组大小:n
    private String[] items;
    private int n = 0;
    //head表示对头下标,tail表示队尾下标
    private int head = 0;
    private int tail = 0;

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

    //入队
    public boolean enqueue(String item){
        //队列满了
        if((tail + 1) % n == head) return false;
        items[tail] = item;
        tail = (tail + 1) % n;
        return true;
    }

    //出队
    public String dequeue(){
        //如果head==tail 表示队列为空
        if(head == tail) return null;
        String ret = items[head];
        head = (head + 1) % n;
        return ret;
    }
  
  
  public static void main(String[] args) {
        CircularQueue circularQueue = new CircularQueue(20);
        circularQueue.enqueue("abc");
        circularQueue.enqueue("edf");
        circularQueue.enqueue("hij");
        String a = circularQueue.dequeue();
        String b = circularQueue.dequeue();
        System.out.println(a);
        System.out.println(b);

    }
}

输出的结果:

abc
edf

通过上述的代码,可以知道虽然循环队列解决之前的数据搬移的情况,但是它带来一个缺点,就是当队列满的时候,tail指针指向的实际位置是没有存储数据的,所以,循环会浪费一个数组的存储空间。

欢迎浏览我的个人博客:https://chasing987.github.io/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值