用数组模拟队列

定义

队列是一种特殊的线性表,它的特点是先进先出,即先入队列的先队列。队列的插入是在队列尾部(rear),队列的删除是在队列头部(front)

数组模拟队列

在这里插入图片描述

变量说明

maxSize:队列的最大容量
rear:记录队列尾部的下标,指向队尾元素,队尾元素为 arr[rear]
front:记录队列头部的下标,指向队列头的前一个位置,即队列的第一个元素为 arr[front+1]

队列满的条件:
rear=maxSize-1
队列空的条件:
rear=front

代码实现

//使用数组模拟队列-编写一个ArrayQueue类
class ArrayQueue{
    private int maxSize; //数组的最大容量
    private int front; //指向队列头
    private int rear; //指向队列尾
    private int[] arr; //该数组用于存放数据,模拟队列


    //创建队列的构造器
    public ArrayQueue(int arrayMaxSize){
        maxSize=arrayMaxSize;

        arr=new int[maxSize];
        front =-1;//指向队列头部,在分析出front是指向队列头的前一个位置,
        rear=-1; //指向队列尾部,指向队列尾部的元素(及就是队列的最后一个位置)
    }

    //判断队列是否满
    public boolean isFull(){
        return rear==maxSize-1;
    }

    //判断队列是否为空
    public boolean isEmpty(){
        return rear==front;
    }

    //添加数据到队列
    public void addQueue(int n){
        //判断队列是否满
        if (isFull()){
            System.out.println("队列满,不能加入数据!");
            return;
        }
        rear++;
        arr[rear]=n;
    }
    //获取队列的数据,数据出队列
    public int getQueue(){
        //判断队列是否空
        if(isEmpty()){
            //通过抛出异常来处理
           throw new RuntimeException("队列空,不能取数据");
        }
        front++;
        return arr[front];
    }
    //显示队列的所有数据
    public void showQueue(){
        //遍历
        if(isEmpty()){
            System.out.println("队列为空,没有数据");
            return ;
        }

        for (int i = 0; i <arr.length ; i++) {
            System.out.printf("arr[%d]=%d\n",i,arr[i]);
        }
    }

    //显示队列的头数据,注意不是取出数据
    public int headQueue(){
        if(isEmpty()){
          throw  new RuntimeException("队列为空,无数据");
        }
        return arr[front+1];
    }
}

缺陷

用普通数组模拟队列,在对队列进行一轮增加与删除后,及时队列显示为空,也在无法进行添加操作,因为队列的头下标和尾下标已经到了数组的最后,无法进行翻转。所以我们将采用数组模拟环形队列,来解决这个问题。

数组模拟环形队列

改造

front调整为:指向队列的第一个元素,即环形队列的第一个元素为 arr[fornt]
rear调整为:指向队列的最后一个元素的后一个位置
队列满的 条件:
(rear+1)%maxsize=front
队列为空的条件:
rear==front
队列中有效数据的个数:
(rear+maxsize-front)%maxsize

代码

class CircleArray {
    private int maxSize; //数组的最大容量
    private int front; //指向队列的第一个元素,
    private int rear; //指向队列最后一个元素的后一个位置
    private int[] arr; //该数组用于存放数据,模拟队列

    public CircleArray(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("队列满,不能加入数据!");
            return;
        }
        //直接将数据加入
        arr[rear] = n;
        //将rear后移,这里必须考虑取模
        rear = (rear + 1) % maxSize;
    }

    //获取队列的数据,数据出队列
    public int getQueue() {
        //判断队列是否空
        if (isEmpty()) {
            //通过抛出异常来处理
            throw new RuntimeException("队列空,不能取数据");
        }
        //这里需要分析出,front是指向队列的第一个元素
        //1、先把front对应的值保留到一个临时变量
        //3、将front后移
        //4、将临时保存的变量返回
        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 size() {
        return (rear + maxSize - front) % maxSize;
    }

    //显示队列的头数据,注意不是取出数据
    public int headQueue() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空,无数据");
        }
        return arr[front];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章