循环队列讲解,以及Java实现代码

目录

一.循环队列概念

二.队满和队空的情况 

 三.代码的实现

总结



😽个人主页: tq02的博客_CSDN博客-C语言,Java,Java数据结构领域博主
 🌈梦的目标:努力学习,向Java进发,拼搏一切,让自己的未来不会有遗憾。
 🎁欢迎各位→点赞👍 + 收藏⭐ + 评论📝+关注✨
  本章讲解内容:循环队列 的讲解     →栈与队列的讲解

  使用编译器:IDEA

一.循环队列概念

        在学习循环队列前,我们应该学会队列知识,知识可查看: 队列的知识 。循环队列可以理解为一个圆圈,首尾相连。

 解析,top为队头,rear为队尾。

元素进队时,赋值给rear指针的区域,然后rear指针移动到下一区域。                       

元素出队时,top指针向前移动一位。


二.队满和队空的情况 

队空:队列里无元素的情况,也就是还未有元素进队列,又或者元素全部出队。

 图一,循环队列中并无元素,当top和rear共同指向时,无元素,为队空

 图二, 同样top和rear指针相遇,可是循环队列中却全有元素。

注:因此为区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。

 队满情况:当循环队列中只剩下一个空存储单元时,队列就已经满了。如下图

结论队列空:front==rear;            队列满:(rear+1)%N==front;

        队列元素个数:(rear – front + N)%N         N为队列长度、front为头结点、rear为尾结点


 三.代码的实现

 我们使用数组实现循环队列。

class ArrayQueue1 {
    private int MaxSize; //数组长度
    private int front;    //头结点
    private int rear;    //尾结点
    private int[] arr;
 
    //创建队列的构造器
 
    public ArrayQueue1(int maxSize) {
        MaxSize = maxSize;
        arr = new int[maxSize];
        front = 0;
        rear = 0;
    }
 
    public boolean isFull() {
        return (rear + 1) % MaxSize == front;
    }
 
    public boolean isEmpty() {
        return front == rear;
    }
 
    public void addQueue(int n) {
        //判断队列满
        if (isFull()) {
            System.out.println("队列满,不能加入数据");
            return;
        }
        arr[rear] = n;
        rear = (rear + 1) % MaxSize;
    }
 
    // 获取队列的数据
    public int getQueue() {
        if (isEmpty()) {
          return -1;
        }
        // front 指向队列的第一个元素
        // front 后移
        int value = arr[front];
        front = (front + 1) % MaxSize;
        return value;
 
    }
 
    //显示队列的所有数据
    public void showQueue() {
        //遍历
        if (isEmpty()) {
            System.out.println("队列为空");
            return;
        }
        // 从front开始遍历
        for (int i = front; i < front + size(); i++) {
            System.out.printf("arr[%d]=%d\n", i % MaxSize, arr[i % MaxSize]);
        }
    }
 
    // 显示队列的头数据,不是取出数据
    public int headQueue() {
        if (isEmpty()) {
           System.out.println("队列为空");
            return;
        }
        return arr[front];
    }
 
    //求出当前队列有效数据
    public int size() {
        return (rear + MaxSize - front) % MaxSize;
    }
}

总结

       循环队列很简单,相当于一条队伍围成一个圈。关键在于求队列长度、队列是否满、是否为空时,求算方法不同。

  • 37
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 31
    评论
### 回答1: Java中的循环引用是指两个或多个对象之间相互引用,形成一个循环的引用链,导致这些对象无法被垃圾回收器回收,从而造成内存泄漏。 在Java中,垃圾回收器通常使用引用计数算法来判断对象是否可以被回收。当一个对象被创建时,其引用计数为1,每当有一个引用指向该对象时,其引用计数就加1,当引用计数为0时,该对象就可以被回收。但是,循环引用会导致对象之间的引用计数无法归零,从而导致内存泄漏。 下面是一个循环引用的示例: ``` class A { private B b; public void setB(B b) { this.b = b; } } class B { private A a; public void setA(A a) { this.a = a; } } public class Main { public static void main(String[] args) { A a = new A(); B b = new B(); a.setB(b); b.setA(a); } } ``` 在上面的示例中,类A和类B相互引用,当对象a和对象b被创建后,它们之间形成了一个循环引用链,导致它们无法被回收,从而造成内存泄漏。 为了避免循环引用造成的内存泄漏问题,我们可以采用一些方法来消除循环引用,例如使用弱引用、软引用或者手动断开对象之间的引用关系等。 ### 回答2: Java中的循环引用指的是两个或多个对象互相引用,导致内存泄漏的情况。在Java中,如果两个对象相互引用,并且没有其他对象引用它们,那么它们将无法被垃圾回收器回收,从而引发内存泄漏问题。 循环引用通常发生在对象之间建立了双向关联或者使用了强引用。当对象A引用了对象B,对象B又引用了对象A时,就形成了循环引用。这种情况下,如果没有及时打破循环引用,垃圾回收器无法识别并回收这些对象,导致内存占用不断增加,最终导致内存泄漏问题。 为了避免循环引用导致的内存泄漏,可以采取以下几种方式: 1. 避免使用强引用:使用弱引用或软引用来代替强引用。弱引用和软引用的对象在内存紧张时会被垃圾回收器回收,因此不会导致循环引用问题。 2. 及时打破循环引用:在不再需要对象之间的引用关系时,手动断开它们之间的引用,使得垃圾回收器可以正确地回收这些对象。可以通过调用对象的setter方法将引用置为null,或者使用弱引用来间接引用对象。 3. 使用引用队列:可以使用引用队列来追踪对象的引用,在对象被垃圾回收时,可以通过引用队列获取到对象的引用,并及时进行相关处理,防止循环引用导致的内存泄漏。 总之,Java循环引用是一种常见的内存泄漏问题,但可以通过采用适当的引用类型、及时打破引用关系和使用引用队列等方式来解决。在编写Java程序时,需要注意避免循环引用的发生,以确保程序的内存使用和性能都能得到有效的管理和优化。 ### 回答3: Java中的循环引用指的是两个或多个对象相互引用并且形成一个闭环的情况。这种情况下,对象之间无法被垃圾回收器正确地回收,可能导致内存泄漏的问题。 循环引用通常发生在两个对象相互引用,并且至少有一个对象被当作垃圾数据,即没有被其他部分引用。垃圾回收器通过检测到不可达对象进行垃圾回收,但是在循环引用的情况下,由于对象之间互相引用,无法判断是否为垃圾数据,因此这些对象会一直留在内存中,造成内存泄漏。 在Java中,循环引用可能发生在使用强引用、软引用、弱引用和虚引用等不同类型的引用。例如,如果两个对象通过相互引用形成一个闭环,并且这些对象都是通过强引用来引用的,垃圾回收器将无法回收这些对象。解决这个问题的一种方法是使用弱引用或者软引用,这些引用类型在内存不足时会被垃圾回收器自动回收。 为避免循环引用的情况发生,可以使用一些策略来管理对象之间的引用关系。例如,避免对象之间相互引用通过提供访问接口来处理关联对象,而不是直接引用。另外,当不再需要一个对象时,需要明确地释放相关资源,并将该对象的引用置为null,以便垃圾回收器能够正确地回收它。 总之,Java循环引用是指对象之间相互引用并形成一个闭环,导致垃圾回收器无法正确回收这些对象的情况。要避免循环引用的发生,可以使用不同类型的引用,以及合理管理对象之间的关联关系。
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tq02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值