本文共 1442 字,大约阅读时间需要 4 分钟。
/*循环队列的核心思想:1)预留一个空间,区分队列为0和队列已满的情况2)注意出队和入队时,front,tail后移的写法(%data.length),来实现循环*/public class LoopQueueimplements Queue { 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 boolean isEmpty() { return size==0; } @Override public int getSize() { return size; } @Override public void enqueue(E e) { if((tail+1)%data.length==front) resize(getCapacity()*2);//不能传data.length,因为需要传入队列中有效容量的大小 data[tail]=e; tail=(tail+1)%data.length; size++; } @Override public E dequeue() { if(isEmpty()) { throw new IllegalArgumentException("Can not dequeue from an empty queue."); } E ret=data[front]; data[front]=null; front=(front+1)%data.length; size--; if(size==getCapacity()/4&& getCapacity()/2!=0) resize(getCapacity()/2); return ret; } @Override public E getFront() { if(isEmpty()) throw new IllegalArgumentException("Queue is empty. "); return data[front]; } public void resize(int newCapacity) { E newData[]=(E[])new Object[newCapacity+1]; for(int i=0;i queue=new ArrayQueue(); for(int i=0;i<10;i++) { queue.enqueue(i); System.out.println(queue); if(i%3==2) { queue.dequeue(); System.out.println(queue); } } }}
转载地址:http://hbmki.baihongyu.com/