一.简介
先进先出(FIFO):只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。即先添加的数据先获取,后添加的数据后获取。
使用场景:
1.数据排队
2.BFS(广度优先搜索算法实现)
3.消息队列
二.实现
package com.vincent;
import java.util.Arrays;
import java.util.NoSuchElementException;
public class ArrayQueue<T> {
private static final int DEFAULT_CAPACITY = 16;
private int size;
private T[] elements;
public ArrayQueue(){
elements = (T[])new Object[DEFAULT_CAPACITY];
}
public ArrayQueue(int capacity){
if(capacity <=0 ){
throw new IllegalArgumentException("容量必须大于0");
}
//确保容量为2的次方
int i = 1;
while(i < capacity){
i = i << 1;
}
elements = (T[])new Object[i];
}
public void add(T item){
if(size == elements.length){
elements = Arrays.copyOf(elements,elements.length << 1);
}
elements[size++] = item;
}
public T popLeft(){
if(size == 0){
throw new NoSuchElementException("队列为空");
}
T item = elements[0];
System.arraycopy(elements,1,elements,0,--size);
elements[size] = null; //置空最后一个数据,防止内存泄漏
return item;
}
public int size(){
return size;
}
@Override
public String toString() {
StringBuilder desc = new StringBuilder();
desc.append("[");
for(int i=0;i<size;i++){
desc.append(elements[i]);
if(i != size-1){
desc.append(",");
}
else{
desc.append("]");
}
}
return desc.toString();
}
public static void main(String[] args) {
ArrayQueue<Integer> queue = new ArrayQueue<>();
for(int i=0;i<10;i++){
queue.add(i);
}
System.out.println(queue);
for(int i=0;i<5;i++){
System.out.print(queue.popLeft() + "\t");
}
System.out.println();
System.out.println(queue);
}
}
效果:
三.总结
1.基于数组实现的队列在数据较多时动态扩容移动数据相对耗时
2.基于数组实现的队列在数据出队后需要移动数据元素,尤其是数据较多时移动会相对耗时
3.该队列在每次出队数据后都会移动数据,效率相对较低,可使用环形队列进一步提高数据出队效率。