队列

一、需求场景

  • 排队叫号

二、队列特点

  • 有序列表
  • 先入先出

三、使用数组模拟队列

1、示意图

2、细节说明

  • 需要三个元素来实现队列的模拟:
    • maxSize:最大容量,固定不变
    • front:指向队列的第一个元素的前一个位置;初始化时,因为还没有元素,所以指向-1
    • rear:指向队列的最后一个元素;初始化时,因为还没有元素,所以指向-1
  • 队列空还是满的判断
    • front=rear:队列为空
    • rear==maxSize-1:队列为满
  • 入列操作思路
    • 判断是否满了
    • 未满情况下,rear+1,然后存放数据
  • 出列操作思路
    • 判断是否为空
    • 非空情况下,取出数据,front-1
  • 注意
    • 出列要移动指针,显示数据不用移动,入列亦同。

四、实战

1、实现思路

  • 万事万物皆对象====>>>编写一个类,来模拟数组队列ArrayQueue。
  • 类的成员
    • 属性:刻画出队列的特征,正式因为这些特征,它才是它,而不是别的
    • 构造器:因为并非JavaBean,需要自己根据情况构建。
    • 方法:是够为空,是否为满,添加数据,删除数据,遍历

2、代码实现

class ArrayQueue{
    private int maxSize;
    private int front;
    private int rear;
    private int[] arr;

    public ArrayQueue(int arrMaxSize){
        maxSize = arrMaxSize;
        arr = new int[maxSize];
        front = -1; //这里自定义的,但是含义要明白:front指向的是第一个数据的前一个位置
        rear = -1;  //rear指向的是最后一个数据
    }

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

    public boolean isFull(){
        return rear == maxSize-1;
    }

    public void addQueue(int num){
        if (isFull()){
            System.out.println("队列已满");
            return;
        }
        rear++;
        arr[rear] = num;
    }

    public int deleteQueue(){
        if (isEmpty()){
            System.out.println("队列为空");
        }
        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]);
        }//这里用foreach就不能得到第几了
    }
}

五、优化:循坏队列

1、问题

  • 上述队列,只能使用一次
  • 用取模运算实现循环队列,达到复用效果

2、实现思路

  • 首先,需要将条形的数组,看做是环形的循环的数组

  • 然后,对front和rear的含义重新定义

    • front:指向队列第一个元素;初始值为0
    • rear:指向队列最后一个元素的后一个位置,因为我们想空出一个位置作为约定;初始值是0;
  • 队列为满是的判断条件是:(rear+1) % maxSize == front

  • 队列为空的判断条件是:rear == front

  • 有效的数据个数为:(rear - front + maxSize) % maxSize

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...