package cmj.datastructure.list;
import java.util.Arrays;
public class Queue {
private transient Object[] elementData;
private int size;
/** 数组的头部,即 下次删除数据的 index */
private int head;
/** 数组的尾部,即 下次插入数据的 index */
private int tail;
/**
* Queue 初始化无参数构造函数
*/
public Queue() {
this(10);
}
/**
* Queue带容量的构造函数
*
* @param initialCapacity初始化容量
*/
public Queue(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
// 新建一个数组
this.elementData = new Object[initialCapacity];
this.head = 0;
this.tail = 0;
this.size = 0;
}
/**
* 检查数组的容量
*
* @param neededMinCapacity所需最小的容量
*/
public void ensureCapacity(int neededMinCapacity) {
int currCapacity = elementData.length;// 获取当前数据的全部容量
// 需要扩容的情况
if (neededMinCapacity > currCapacity) {
int newCapacity = (currCapacity * 3) / 2 + 1;// 计算新的容量
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
/**
* 添加数据到尾部
*
* @param o——要添加的数据
*/
public void enQueue(Object o) {
// 确定ArrayList的容量大小
ensureCapacity(size + 1); // Increments modCount!!
// 添加o到ArrayList中
elementData[tail] = o;
size++;
tail++;
}
/**
* 删除数据 从头部
*
* @return——被删除的数据
*/
public Object deQueue() {
if (isEmpty()) {
throw new RuntimeException("队列为空");
}
Object deleted = (Object) elementData[head];
elementData[head] = null;
size--;
head++;
return deleted;
}
public boolean isEmpty() {
return size <= 0 ? true : false;
}
public int size() {
return size;
}
@Override
public String toString() {
if (isEmpty()) {
return "[空队列]";
}
String arraylist = "[";
for (int i = head; i < tail; i++) {
if (i == tail - 1) {
arraylist += elementData[i].toString() + "]";
} else {
arraylist += elementData[i].toString() + "--->";
}
}
return arraylist;
}
public static void main(String[] args) {
Queue queue = new Queue(4);
queue.enQueue("one");
queue.enQueue("two");
queue.enQueue("three");
queue.enQueue("four");
queue.enQueue("five");
System.out.println(queue);
queue.deQueue();
System.out.println(queue);
queue.deQueue();
System.out.println(queue);
queue.deQueue();
System.out.println(queue);
queue.deQueue();
System.out.println(queue);
queue.deQueue();
System.out.println(queue);
}
}