2.2 队列(数组队列模拟环形队列)

数组模拟环形队列

数组队列问题:
(1)目前数组使用了一次就不能用了,没有达到复用的效果
(2)将这个数组使用算法,改进成一个环形队列

解决办法:
数组模拟环形队列,对前面的数组模拟队列优化,充分利用数组,因此将数组看做是一个环形的(通过取模实现

使用数组模拟环形队列的思路分析:
在这里插入图片描述
思路如下:
1.front变量的含义做一个调整:front就指向队列的第一个元素,也就是arr[front]就是队列的第一个元素
front初始值=0
2.rear变量的:rear指向最后一元素的后一个位置,因为希望空出一个空间做为约定。
rear初始值=0
3.当队列满时,条件时(rea+1)%maxSize=front【满】
4.对队列为空的条件,rear == front【空】
5.当我们这样分析,队列中有效的数据个数 (rear + maSize - front )%maxSize
6.原来的代码修改成环形队列。

需要修改:
数组队列的初始化

public CircleArray(int maxSize){
    //front初始值=0
    //rear初始值=0
    this.maxSize = maxSize;
    arr = new int[maxSize];
}

判断 队列是否满

//判断队列是否为满
public boolean isFull(){
    return (rear + 1) % maxSize == 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对应的值保存到一个临时变量
    //2.将front后移,考虑取模
    //3.将临时变量返回
    int flag = arr[front];
    front = (front + 1) % maxSize;
    return flag;
}

展示所有队列元素

//展示所有数据
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];
}

ps:以上笔记均来自尚硅谷韩顺平老师《Java数据结构与java算法》

猜你喜欢

转载自blog.csdn.net/weixin_45706249/article/details/107245250