• 队列


    一、需求场景

    • 排队叫号

    二、队列特点

    • 有序列表
    • 先入先出

    三、使用数组模拟队列

    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
    ", i, arr[i]);
            }//这里用foreach就不能得到第几了
        }
    }
    

    五、优化:循坏队列

    1、问题

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

    2、实现思路

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

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

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

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

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

  • 相关阅读:
    [react002] component基本用法
    [react001] 使用webpack自动构建react 项目
    [Elixir009]像GenServer一样用behaviour来规范接口
    [Elixir008]Nested Module里的动态函数调用方式
    [Elixir007] on_definition规范函数定义时的各种潜规则
    [Elixir006]CSV(Comma-separated values)处理
    [Elixir005] 查看指定数据的详细信息 i helper
    [Elixir004]通过环境变量(Environment Variables)来管理config
    [Elixir003] Mix Archives
    [Elixir002]节点启动后自动连接其它节点
  • 原文地址:https://www.cnblogs.com/liuzhixian666/p/14171059.html
Copyright © 2020-2023  润新知