FIFO( First Input First Output)简单说就是指先进先出.
- 类名:Container<T>
- 方法:add(T t),take()
实现分析:添加操作
实现分析:取操作实现
/**
* 创建一个容器(队列容器)
* 1)数据结构:数组(线性结构)
* 2)算法:FIFO
*/
class ArrayContainer<T>{
/**通过数组存储元素*/
private Object[] array;
/**通过size属性记录有效元素个数(
实际存储的我们放入的元素)*/
private int size;
public ArrayContainer() {
this(16);
}
public ArrayContainer(int cap) {
if(cap==0)
throw new IllegalArgumentException("你传入的参数无效");
array=new Object[cap];
}
/**向容器添加数据:永远添加在size位置*/
public void add(T t) {
//1.判定容器是否已满,满了扩容
if(size==array.length) {
//创建新数组,其长度为原数组长度两倍
//将原数组数据复制到新数组
//让原数组原先的引用指向新的数组
array=Arrays.copyOf(array,2*array.length);
}
//2.将数据放在size位置
array[size]=t;
//3.有效元素个数加1
size++;
}
/**从容器获取数据:永远从第0个位置开始*/
@SuppressWarnings("unchecked")
public T take() {
//1.判定容器是否为空
if(size==0)
throw new NoSuchElementException("没有元素");
//2.取数据
Object obj=array[0];
//3.移动元素
System.arraycopy(array,//从哪个数组拷贝
1,//从哪个位置复制
array,//放到哪个数组
0,//从哪开始放
size-1);//放多少
//4.有效元素个数减1
size--;
//5.size位置元素设置为null(可选)
array[size]=null;
//6.返回元素
return (T)obj;
}
public int size() {
return size;
}
@Override
public String toString() {//不要求写
if (size==0)return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (int i=0;i<size;i++) {
sb.append(array[i]).append(",");
}
sb.deleteCharAt(sb.lastIndexOf(","));
return sb.append("]").toString();
}
}