手动实现一个集合类
数据结构: 队列
底层: 循环数组
利用循环数组实现队列:MyQueue
public class MyQueue <T> {
private final int INIT_CAPACITY = 10; //默认的初始容量
private final int MAX_CAPACITY = Integer.MAX_VALUE - 8 ;//最大阈值
private Object [] arrs;//底层数组
private int size;// 元素存储数量
private int head; // 头指向(下标)
private int end;// 尾指向(下标)
public MyQueue(){
arrs = new Object[INIT_CAPACITY];
}
public MyQueue(int initCapacity){
if (initCapacity <= 0 || initCapacity > MAX_CAPACITY)
throw new IllegalArgumentException("initCapacity = "+ initCapacity);
arrs = new Object[initCapacity];
}
public boolean offer(T t){
if (t == null) throw new IllegalArgumentException("parame is null");
if (size == 0){// 队列为空
arrs[head] = t;
end = head;
size++;
return true;
}
if (size == arrs.length){// 数组存满了
int newLen = getLen();
grow(newLen);
}
// 可以存储
// 尾指向后移(有可能从数组末尾移动到数组下标0的位置)
end = (end + 1) % arrs.length;
arrs[end] = t;// 把元素添加到新的(移动过之后的)的尾位置
size++;
return true;
}
private void grow(int newLen) {
// 创建一个新数组
Object[] objects = new Object[newLen];
// 把旧数组的数据转移到新数组
for (int i = 0; i < size; i++) {
int index = (head + i) % arrs.length;
objects[i] = arrs[index];
}
arrs = objects;
head = 0;
end = size - 1;
}
private int getLen() {
// 获取一个新的扩容长度
int oldLen = arrs.length;
int newLen = oldLen << 1;// 新长度是旧长度的两倍
// int newLen = oldLen + (oldLen >> 1);
if (newLen < 0 || newLen > MAX_CAPACITY){
// 新扩容的参数太大了.
newLen = MAX_CAPACITY;
}
if (oldLen == newLen){
// 组数只能这么大了
throw new RuntimeException("arr is max");
}
return newLen;
}
public T poll(){
if (isEmpty())return null;
// 不空;
// head 后移
T oldValue = (T)arrs[head];// 记录旧值
head = (head + 1) % arrs.length;
size--;
return oldValue;
}
public boolean isEmpty() {
return size == 0;
}
public T peek(){
if (isEmpty()) return null;
return (T)arrs[head];
}
public int size(){
return size;
}
@Override
public String toString() {
for (int i = 0; i < size; i++) {
int index = (head + i) % arrs.length;
System.out.print(arrs[index] + " ");
}
return "";
}
}
利用链表实现队列