package DataDtructure; /** * ClassName: LoopQueue * Company:华中科技大学电气学院 * date: 2019/8/23 16:23 * author: YEXIN * version: 1.0 * since: JDK 1.8 * Description:实现循环队列,不再使用动态数组了 */ public class LoopQueue<E> implements Queue<E> { private E[] data; private int front,tail; private int size; public LoopQueue(int capacity){ data = (E[])new Object[capacity+1]; front = 0; tail = 0; size = 0; } public LoopQueue(){ this(10); } public int getCapacity(){ return data.length -1; } @Override public int getSize() { return size; } @Override public boolean isEmpty() { return tail == front; } @Override public void enqueue(E e) { if((tail+1)% data.length == front){//队列满了 resize(getCapacity()*2);//扩容 } data[tail] = e; tail = (tail+1)%data.length; size++; } private void resize(int newCapacity){ E[] newdata = (E[])new Object[newCapacity + 1]; for(int i = 0;i < size; i++){ newdata[i] = data[(i+front)% data.length]; } data = newdata; front = 0; tail = size; } @Override public E getFront() { if(isEmpty()){ throw new IllegalArgumentException("the Queue is empty"); } return data[front]; } @Override public E dequeue() { if(isEmpty()){ throw new IllegalArgumentException("the Queue is empty"); } E res = data[front]; data[front]=null; front = (front+1)%data.length; size--; if(size == getCapacity()/4 && data.length/2 != 0){ resize(data.length/2); } return res; } @Override public String toString(){ StringBuilder res = new StringBuilder(); res.append(String.format("Queue:size = %d,capacity = %d\n",size,getCapacity())); res.append("front ["); for(int i = front ;i != tail; i=(i+1)%data.length){ res.append(data[i]); if((i+1)%data.length != tail){ res.append(","); } } res.append("] tail"); return res.toString(); } }
java实现数据结构---循环队列
最新推荐文章于 2022-03-27 15:20:34 发布