隊(duì)列Queue——數(shù)組隊(duì)列

一.簡介:

1.隊(duì)列也是一種線性結(jié)構(gòu)。

2.相比數(shù)組,隊(duì)列對應(yīng)的操作是數(shù)組的子集。

3.只能從一端(隊(duì)尾)添加元素,只能從另一端(對首)取出元素。

也就是說隊(duì)列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)(FIFO First In First Out)

二.隊(duì)列的數(shù)組實(shí)現(xiàn):

package data_structure.arrays;

public class MyArray<T> {

  private T[] data;
  private int size;

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

  /**
   * 無參構(gòu)造函數(shù)初始容量10
   */
  @SuppressWarnings("unchecked")
  public MyArray() {
    this(10);
  }

  /**
   * 獲取元素個(gè)數(shù)
   */
  public int getSize() {
    return size;
  }

  /**
   * 獲取第一個(gè)元素
   */
  public T getFirst() {
    return get(0);
  }

  /**
   * 獲取最后一個(gè)元素
   */
  public T getLast() {
    return get(size - 1);
  }

  /**
   * 獲取數(shù)組容量
   */
  public int getCapacity() {
    return data.length;
  }

  /**
   * 數(shù)組是否是空的
   */
  public boolean isEmpty() {
    return size == 0;
  }

  /**
   * 在index 索引位置添加一個(gè)元素t O(n/2)=O(n)時(shí)間復(fù)雜度
   */
  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++;

  }

  /**
   * 在數(shù)組開始位置添加一個(gè)元素t O(n)時(shí)間復(fù)雜度
   */
  public void addFirst(T t) {
    add(0, t);
  }

  /**
   * 在當(dāng)前所有元素后添加一個(gè)元素t O(1)均攤復(fù)雜度
   */
  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];
  }

  /**
   * 查找數(shù)組中元素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;
  }

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

  /**
   * 修改index索引位置的元素 O(1)時(shí)間復(fù)雜度
   */
  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)時(shí)間復(fù)雜度
   */
  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--;
    //防止復(fù)雜度震蕩,防止創(chuàng)建0size的數(shù)組
    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);
    }
  }

  /**
   * 移除所有元素中的第一個(gè)元素 O(n)時(shí)間復(fù)雜度
   */
  public T removeFirst() {
    return remove(0);
  }

  /**
   * 移除所有元素中的最后個(gè)元素 O(1)時(shí)間復(fù)雜度
   */
  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<E> implements Queue<E> {

  MyArray<E> 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);
  }

  /**
   * 從隊(duì)首取出元素
   */
  @Override
  public E dequeue() {
    return myArray.removeFirst();
  }

  /**
   * 獲取隊(duì)列第一個(gè)元素
   */
  @Override
  public E getFront() {
    return myArray.getFirst();
  }

  /**
   * 獲取隊(duì)列中元素個(gè)數(shù)
   */
  @Override
  public int getSize() {
    return myArray.getSize();
  }

  /**
   * 判斷隊(duì)列是否是空的
   */
  @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();
  }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,227評論 8 265
  • Netty實(shí)踐與NIO原理 一、阻塞IO與非阻塞IO Linux網(wǎng)絡(luò)IO模型(5種) (1)阻塞IO模型 所有文件...
    fly_wings閱讀 299評論 0 0
  • [TOC] 極大似然估計(jì)的一般思想 極大似然估計(jì)(Maximum Likelihood),顧名思義,就是根據(jù)似然度...
    lanjly閱讀 519評論 0 0
  • # -*- coding: utf-8 -*- import numpy as np import torch i...
    晨曦日月閱讀 425評論 0 0
  • 純露概論什么是純露?芳香植物在蒸餾過程中油水分離,因密度不同,所含的親油成分會(huì)漂浮在上層,形為“精油”,而偏水溶性...
    曦曦格格閱讀 482評論 0 0

友情鏈接更多精彩內(nèi)容