package cn.xl.c1;
/**
* Queue一个先进先出(first in first out,FIFO)得队列
* 所谓的队列,也是一个含有至少两个基本操作的抽象数据类型:插入新的元素;删除最久时间插入的元素。
* 遵循FIFO(First in,first out,先进先出)的原则。
* MyQueue采用环形数组实现
* @author XIAOLONG
*
*/
public class MyQueue<E> {
private int size,head,tail;
private Object[] elementData;
private final int initialCapacity = 4;
public MyQueue(){
head = tail = -1;
elementData = new Object[initialCapacity];
}
/**
* 向队列中添加元素
* @param o
*/
public void enQueue(Object o){
ensureCapacity();
if( head == -1) {
tail = head = 0;
}
size ++;
elementData[tail] = o;
tail ++;
}
/**
* 删除栈顶元素,并返回旧栈顶元素
* @return 旧栈顶元素
*/
public Object deQueue(){
Object element = elementData[head];
if(head == tail){
head = tail = -1;
}else if(head == elementData.length-1){
head = 0;
}else{
head ++;
}
size --;
return element;
}
/**
* 判断队列是否为空
* @return
*/
public boolean isEmpty(){
return head == -1;
}
/**
* 返回自身长度
* @return
*/
public int size(){
return size;
}
/**
* 判断队列是否已满
* @return
*/
public boolean isFull() {
return (head == 0 && tail == elementData.length);
}
/**
* 扩展容量,如果队列有效数据已经占满空间则增加2,否则覆盖无效数据,重新分配数据空间
* @param 当前队列所需最小容量size
*/
private void ensureCapacity(){
if(isFull()){
Object [] oldData = elementData;
elementData = new Object[elementData.length + 2];
System.arraycopy(oldData, head,elementData , 0, oldData.length);
}else if(head > 0){
Object [] oldData = elementData;
System.arraycopy(oldData, head,elementData , 0, oldData.length-head);
tail = tail - head ;
head = 0;
}
}
public void printAll() {
for(Object i:elementData)
System.out.print(i+" ");
System.out.println();
}
public static void main(String[] args)
{
MyQueue<Integer> se=new MyQueue<Integer>();
se.enQueue(1);
se.enQueue(2);
se.enQueue(3);
se.enQueue(4);
System.out.println("原始容量下,队列元素为");
se.printAll();
System.out.println("队列满后,继续增加元素5");
se.enQueue(5);
se.printAll();
se.deQueue();
System.out.println("删除队列首元素1,队列首元素为:"+se.elementData[se.head]);
se.deQueue();
se.enQueue(6);
se.enQueue(7);
se.enQueue(8);
se.enQueue(9);
se.enQueue(10);
se.enQueue(11);
se.printAll();
}
}