Java循环队列

简介: Java循环队列



一、循环队列

队列:只能在一端进行插入数据操作,另一端进行删除数据操作的特殊线性表,是一种先进先出的存储结构

插入操作的一端为队尾,删除操作的一端为队头

在线性队列中,一旦队列满了,即使队列的前面有空间,我们也不能插入下一个元素,这时,我们可以使用循环队列,来使用这些空间存储新的值

循环队列: 队头和队尾相连接的队列

二、设计循环队列

我们使用数组来实现循环队列,通过构造器,来创建队列,并设置队列的大小为n

class MyCircularQueue {
    private int[] elem;
    private int front;
    private int rear;
    private int size;
    public MyCircularQueue(int n) {
        elem = new int[n+1];
        front = rear = 0;
        size = n + 1;
    }
}

在创建队列时,我们预留一个空间,以便判断队列满和计算队列元素个数

判断循环队列是否为空

当队头和队尾指向同一位置时,队列是空的

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

判断循环队列是否已满

若队尾的下一个位置是队头,那么循环队列已满

当rear指向最后一个位置时,+1会造成越界,此时我们通过取余(%),让其指向0位置处

public boolean isFull() {
    return ((rear+1)%size == front);
}

添加数据

首先判断队列是否已满,若已满,添加失败,返回false,若没有,则在队尾rear位置添加数据,并将rear向后移动

public boolean enQueue(int value) {
    //判断队列是否满
    if(isFull()){
        return false;
    }else {
        elem[rear] = value;
        rear = (rear+1)%size;
        return true;
    }
}

删除数据

首先判断队列是否为空,若为空,删除失败,返回false,若不为空,则将front向后移动

public boolean deQueue() {
        //队列是否为空
        if(isEmpty()){
            return false;
        }else {
            front = (front + 1) % size;
            return true;
        }
    }

获取队头元素

首先判断队列是否为空,若为空,队列中无元素,抛出异常,若不为空,返回队头元素,并将front向后移动

public int getFront() {
    if(isEmpty()){
        throw new RuntimeException("队列为空,无元素!");
    }else {
        int val = elem[front];
        front = (front + 1) % size;
        return val;
    }
}

计算队列中元素个数

public int size(){
    return (rear + size - front) % size;
}

完整代码

class MyCircularQueue {
    private int[] elem;
    private int front;
    private int rear;
    private int size;
    public MyCircularQueue(int n) {
        elem = new int[n+1];
        front = rear = 0;
        size = n + 1;
    }
    public boolean isEmpty() {
        return front == rear;
    }
    public boolean isFull() {
        return ((rear+1)%size == front);
    }
    public boolean enQueue(int value) {
        //判断队列是否满
        if(isFull()){
            return false;
        }else {
            elem[rear] = value;
            rear = (rear+1)%size;
            return true;
        }
    }
    public boolean deQueue() {
        //队列是否为空
        if(isEmpty()){
            return false;
        }else {
            front = (front + 1) % size;
            return true;
        }
    }
    public int getFront() {
        if(isEmpty()){
            throw new RuntimeException("队列为空,无元素!");
        }else {
            int val = elem[front];
            front = (front + 1) % size;
            return val;
        }
    }
    public int size(){
        return (rear + size - front) % size;
    }
}
目录
相关文章
|
3月前
|
Java
【Java】栈和队列的模拟实现(包括循环队列)
【Java】栈和队列的模拟实现(包括循环队列)
10 0
|
机器学习/深度学习 Java 编译器
循环队列讲解,以及Java实现代码
循环队列讲解,以及Java实现代码
48 0
|
存储 Java
Java数组实现循环队列
Java数组实现循环队列
数据结构---循环队列与循环双端队列的实现(Java实现)
队列的底层用双向链表实现,因为使用双向链表保证了入队列和出队列的时间复杂度都达到O(1),那能否使用一段连续的空间实现呢?当然可以,先分析用普通的数组对其实现进行分析,看看会出现哪些问题?
数据结构---循环队列与循环双端队列的实现(Java实现)
|
存储 Java
Java 数组模拟 循环队列
循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。
139 0
|
7天前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
28 7
|
6天前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
6天前
|
存储 监控 安全
一天十道Java面试题----第三天(对线程安全的理解------>线程池中阻塞队列的作用)
这篇文章是Java面试第三天的笔记,讨论了线程安全、Thread与Runnable的区别、守护线程、ThreadLocal原理及内存泄漏问题、并发并行串行的概念、并发三大特性、线程池的使用原因和解释、线程池处理流程,以及线程池中阻塞队列的作用和设计考虑。
|
1天前
|
Java
java开启线程的四种方法
这篇文章介绍了Java中开启线程的四种方法,包括继承Thread类、实现Runnable接口、实现Callable接口和创建线程池,每种方法都提供了代码实现和测试结果。
java开启线程的四种方法
|
4天前
|
存储 缓存 安全
深度剖析Java HashMap:源码分析、线程安全与最佳实践
深度剖析Java HashMap:源码分析、线程安全与最佳实践