队列:数组模拟实现

1,队列基本介绍

  • 队列是一个有序列表,可以用数组或者链表来实现
  • 队列遵循先入先出(FIFO)原则
    队列:数组模拟实现_第1张图片

2,数组模拟队列

  • 队列本身是有序列表,若使用数组的结构存储队列,则队列的声明如上图
  • 因为队列的输入和输出是分别从两端处理,所以需要两个对应的索引数据writeread,而writeread 随着数据的输入和输出移动
  • 在添加数据时,需要考虑的问题
    • 数组是否已经初始化,如果没有初始化,初始化为默认长度,比如10
    • 判断写索引 + 写数据 > 读索引,成立则数组越界,此处通过总数判断
    • 写索引到索引末尾后,应该重置为0继续写入,如果此时读索引位置未变,即没有读事件,则数据越界
  • 在取数据时,需要考虑的问题
    • 写索引与读索引是否相等,相等则没有数据
    • 读索引读取到末尾后,继续读0位置,实现循环处理

3,代码实现

package com.self.datastructure.queue;

import java.lang.annotation.Target;
import java.util.Scanner;

/**
 * @author LiYanBin
 * @create 2020-01-07 15:34
 **/
public class MyQueue {

    // 初始化长度
    private final int DEFAULT_COUNT = 8;

    // 数组
    private int[] array;

    // 数组长度
    private int capacity;

    // 有效数据
    private int totalCount;

    // 读索引, 读索引指向数组数据的当前位置, 即读取当前索引的值
    private int readIndex = 0;

    // 写索引, 写索引指向数据的后一个位置, 即写数据到当前索引
    private int writeIndex = 0;

    // 初始化
    public MyQueue(int count) {
        initMyQueue(count);
    }

    public void initMyQueue(int count) {
        count = count <= 0 ? DEFAULT_COUNT : count;
        capacity = count;
        array = new int[count];
    }

    // 是否为空
    public boolean isEmpty() {
        return totalCount == 0;
    }

    // 是否已经满了
    public boolean isFull() {
        return totalCount == capacity;
    }

    // 写数据
    public boolean putData(int data) {
        if (null == array) {
            initMyQueue(DEFAULT_COUNT);
        }
        if (isFull()) {
            throw new IndexOutOfBoundsException("数据满了...");
        } else {
            array[writeIndex++] = data;
            totalCount++;
            // 如果指向尾部, 则循环执行0索引
            writeIndex = writeIndex % capacity;
        }
        return true;
    }

    // 读数据
    public int readData() {
        if (isEmpty()) {
            throw new IndexOutOfBoundsException("没有数据...");
        }
        int data = array[readIndex++];
        totalCount--;
        readIndex = readIndex % capacity;
        return data;
    }

    // 遍历需要从读位置遍历到写的位置
    public void showDetails() {
        // 条件是从读索引开始, 读取有效数据个数
        System.out.print("totalCount: " + totalCount + "\t");
        for (int i = readIndex; i < readIndex + getTotalCount(); i++) {
            System.out.print(array[i % capacity] + ", ");
        }
        System.out.println();
    }

    // 获取有效数据总数
    public int getTotalCount() {
        // 参考图示
        return totalCount;
    }

}

你可能感兴趣的:(数据结构&算法)