一.简介:
1.队列也是一种线性结构。
2.相比数组,队列对应的操作是数组的子集。
3.只能从一端(队尾)添加元素,只能从另一端(对首)取出元素。
也就是说队列是一种先进先出的数据结构(FIFO First In First Out)
二.队列的数组实现:
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;
}
/**
* 无参构造函数初始容量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<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);
}
/**
* 从队首取出元素
*/
@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();
}
}
网友评论