队列Queue——数组队列

一.简介:

1.队列也是一种线性结构。

2.相比数组,队列对应的操作是数组的子集。

3.只能从一端(队尾)添加元素,只能从另一端(对首)取出元素。

也就是说队列是一种先进先出的数据结构(FIFO First In First Out)

二.队列的数组实现:

package data_structure.arrays;

public class MyArray {

  private T[] data;
  private int size;

  @SuppressWarnings("unchecked")
  public MyArray(int capacity) {
    this.data = (T[]) new Object[capacity];
    this.size = 0;
  }

  /**
   * 无参构造函数初始容量10
   */
  @SuppressWarnings("unchecked")
  public MyArray() {
    this(10);
  }

  /**
   * 获取元素个数
   */
  public int getSize() {
    return size;
  }

  /**
   * 获取第一个元素
   */
  public T getFirst() {
    return get(0);
  }

  /**
   * 获取最后一个元素
   */
  public T getLast() {
    return get(size - 1);
  }

  /**
   * 获取数组容量
   */
  public int getCapacity() {
    return data.length;
  }

  /**
   * 数组是否是空的
   */
  public boolean isEmpty() {
    return size == 0;
  }

  /**
   * 在index 索引位置添加一个元素t O(n/2)=O(n)时间复杂度
   */
  public void add(int index, T t) {

    if (index < 0 || index > size) {
      throw new IllegalArgumentException("Add fail,Require index >=0 and index <=size");
    }
    if (size == data.length) {
      resizeArray(2 * data.length);
    }
    for (int i = size - 1; i >= index; i--) {
      data[i + 1] = data[i];
    }
    data[index] = t;
    size++;

  }

  /**
   * 在数组开始位置添加一个元素t O(n)时间复杂度
   */
  public void addFirst(T t) {
    add(0, t);
  }

  /**
   * 在当前所有元素后添加一个元素t O(1)均摊复杂度
   */
  public void addLast(T t) {
    add(size, t);
  }

  /**
   * 获取index索引位置的元素 0(1)
   */
  public T get(int index) {
    if (index < 0 || index > size - 1) {
      throw new IllegalArgumentException("Get failed,index is illegal");
    }
    return data[index];
  }

  /**
   * 查找数组中元素e所在的索引,如果不存在元素e,则返回-1 O(n)
   */
  public int find(T t) {
    for (int i = 0; i < size; i++) {
      if (data[i].equals(t)) {
        return i;
      }
    }
    return -1;
  }

  /**
   * 是否包含某个元素 O(n)
   */
  public boolean contains(T t) {
    return find(t) != -1;
  }

  /**
   * 修改index索引位置的元素 O(1)时间复杂度
   */
  public void set(int index, T t) {
    if (index < 0 || index > size - 1) {
      throw new IllegalArgumentException("Get failed,index is illegal");
    }
    data[index] = t;
  }


  /**
   * 删除index索引的元素,并返回该元素 O(n/2)=O(n)时间复杂度
   */
  public T remove(int index) {
    if (index < 0 || index > size - 1) {
      throw new IllegalArgumentException("Get failed,index is illegal");
    }
    T ret = data[index];
    for (int i = index; i < size; i++) {
      data[i] = data[i + 1];
    }
    data[size] = null;
    size--;
    //防止复杂度震荡,防止创建0size的数组
    if (size == data.length / 4 && data.length / 2 != 0) {
      resizeArray(data.length / 2);
    }
    return ret;
  }

  public void removeElement(T t) {
    int i = find(t);
    if (i != -1) {
      remove(i);
    }
  }

  /**
   * 移除所有元素中的第一个元素 O(n)时间复杂度
   */
  public T removeFirst() {
    return remove(0);
  }

  /**
   * 移除所有元素中的最后个元素 O(1)时间复杂度
   */
  public T removeLast() {
    return remove(size - 1);
  }

  @SuppressWarnings("unchecked")
  public T[] resizeArray(int length) {
    T[] newArray = (T[]) new Object[length];
    for (int i = 0; i < size; i++) {
      newArray[i] = data[i];
    }
    data = newArray;
    return newArray;
  }

  @Override
  public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append(String.format("Array : size = %d ,capacity = %d \n", size, data.length));
    builder.append("[");
    for (int i = 0; i < size; i++) {
      builder.append(data[i]);
      if (i != size - 1) {
        builder.append(",");
      }
    }
    builder.append("]");
    return builder.toString();
  }
}


package data_structure.Queue;

import data_structure.arrays.MyArray;

public class ArrayQueue implements Queue {

  MyArray myArray;

  public ArrayQueue(int capacity) {
    this.myArray = new MyArray<>(capacity);
  }

  public ArrayQueue() {
    this.myArray = new MyArray<>();
  }

  /**
   * 添加元素到对尾
   */
  @Override
  public void enqueue(E e) {
    myArray.addLast(e);
  }

  /**
   * 从队首取出元素
   */
  @Override
  public E dequeue() {
    return myArray.removeFirst();
  }

  /**
   * 获取队列第一个元素
   */
  @Override
  public E getFront() {
    return myArray.getFirst();
  }

  /**
   * 获取队列中元素个数
   */
  @Override
  public int getSize() {
    return myArray.getSize();
  }

  /**
   * 判断队列是否是空的
   */
  @Override
  public boolean isEmpty() {
    return myArray.isEmpty();
  }

  @Override
  public String toString() {
    StringBuilder res = new StringBuilder();
    res.append("Queue: ");
    res.append("front [");
    for (int i = 0; i < myArray.getSize(); i++) {
      res.append(myArray.get(i));
      if (i != myArray.getSize() - 1) {
        res.append(", ");
      }
    }
    res.append("] tail");
    return res.toString();
  }
}


你可能感兴趣的:(队列Queue——数组队列)