数组模拟循环队列(Java)

Posted yuwenS.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组模拟循环队列(Java)相关的知识,希望对你有一定的参考价值。

通过数组模拟循环队列基于Java实现

队列是一种特殊特殊的线性表,和栈一样,队列是一种操作受到限制的线性表,队列的特殊性在于它只允许在表的前端(front)进行删除操作成为出队,而只能在表的后端(rear)进行插入操作,称为入队。进行插入操作的成为队尾,进行删除操作的称为队头。

队列的介绍

  1. 队列是一个有序列表,可以用数组或是链表来实现
  2. 遵循先入先出的原则。即:先存入队列的数据,要先取出,后存入的要后取出

实现循环队列的具体思路

  1. 定义两个变量front和rear,front指向对头第一个元素,front 的初始值 = 0。rear 指向队列的最后一个元素的后一个位置. 因为希望空出一个空间做为约定,rear 的初始值 = 0
  2. 定义一个数组arr模拟队列,定义一个队列最大容量尾maxSize
  3. 当队列满的条件是 (rear + maxSize) % maxSize == front
  4. 对队列为空的条件是 rear == front
  5. 队列中有效的数据的个数 (rear + maxSize - front) % maxSize
  6. 这样就能形成一个环形队列

环形队列的具体代码实现

public class CircleArrayQueue {
    private int maxSize; //表示数组的最大容量
    //front 变量的含义做一个调整: front 就指向队列的第一个元素, 也就是说 arr[front] 就是队列的第一个元素
    //front 的初始值 = 0
    private int front;//队列头
    //rear 变量的含义做一个调整:rear 指向队列的最后一个元素的后一个位置. 因为希望空出一个空间做为约定.
    //rear 的初始值 = 0
    private int rear;//队列尾
    private int[] arr;//该数据用于存放数据,模拟队列

    public CircleArrayQueue(int arrMaxSize){
        maxSize = arrMaxSize;
        arr = new int[maxSize];
    }
    //判断队列是否满
    public boolean isFull(){
        return (rear +1 ) % maxSize == front;
    }
    //判断对列是否为空
    public boolean isEmpty(){
        return rear == front;
    }
    //添加数据到队列
    public void addQueue(int n){
        //判断队列是否满
        if (isFull()){
            System.out.println("d队列满");
            return;
        }
        //直接将数据加入
        arr[rear] = n;
        //将rear后移,这里必须取模
        rear = (rear + 1) % maxSize;
    }
    //获取队列数据
    public int getQueue(){
        //判断队列是否为空
        if (isEmpty()){
            //抛出异常
            throw  new RuntimeException("队列为空");
        }
        //先把front对应的值保留到一个临时变量
        int value = arr[front];
        //将front后移
        front = (front + 1) % maxSize;
        //将临时变量返回
        return value;
    }
    //显示队列所有数据
    public void showQueue(){
        if (isEmpty()){
            System.out.println("队列为空");
            return;
        }
        for (int i = front; i < front + size(); i++) {
            System.out.println(i % maxSize + " : "+arr[i%maxSize]);
        }
    }
    //求出当前队列有效数据的个数
    public int size(){
        return (rear + maxSize -front) % maxSize;
    }
    //显示队列的头元素,注意不是去除数据
    public int headQueue(){
        if (isEmpty()){
            throw new RuntimeException("队列为空");
        }
        return arr[front];
    }
}

测试

测试操作

 public static void main(String[] args) {
        //因为空出一个空间做为约定所以队列大小要比具体队列数据大1
        CircleArrayQueue circleArrayQueue = new CircleArrayQueue(4);
        //添加队列
        circleArrayQueue.addQueue(2);
        circleArrayQueue.addQueue(1);
        //查看队列中所有元素
        System.out.println("===========队列中的所有数据===========");
        circleArrayQueue.showQueue();
        //显示队列的头元素
        System.out.println("对头元素为:"+circleArrayQueue.headQueue());
        //队列中的有效数据
        System.out.println("队列中的有效数据有:"+circleArrayQueue.size()+" 个");
        //出队
        System.out.println("出队的元素:"+circleArrayQueue.getQueue());
        System.out.println("===========出队之后的队列所有数据===========");
        circleArrayQueue.showQueue();
        //入队
        circleArrayQueue.addQueue(2);
        System.out.println("===========再次入队后队列所有数据===========");
        circleArrayQueue.showQueue();
    }

测试结果
测试结果

以上是关于数组模拟循环队列(Java)的主要内容,如果未能解决你的问题,请参考以下文章

数组模拟循环队列(Java)

用java实现循环队列?

Java数据结构-队列

java数据结构与算法:单向队列与环形队列详解(图片+代码)

线性结构 —— 循环数组

C语言实现使用动态数组实现循环队列