什么是循环队列?
参考:(45条消息) 循环队列_smile_zhangw的博客-CSDN博客_循环队列
实现:
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 boolean isEmpty(){
return front==tail;
}
@Override
public int getSize(){
return size;
}
@Override
public void enqueue(E e){
if((tail+1%data.length==front)) //判断是否已满
resize(getCapacity()*2);
data[tail]=e;
tail=(tail+1)%data.length;
size++;
}
public E dequeue(){
if(isEmpty())
throw new IllegalArgumentException("Cannot 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];
}
@Override
public String toString(){
StringBuilder res=new StringBuilder();
res.append("Queue::");
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();
}
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;
}
}
public static void main(String[] args) {
loopQueue<Integer> queue=new loopQueue<>();
for(int i=0;i<10;i++){
queue.enqueue(i);
System.out.println(queue);
if(i%3==2) {
queue.dequeue();
System.out.println(queue);
}
}
}
}
循环队列遍历的两种写法:
1. for(int i=front;i!=tail;i=(i+1)%data.length)
2. for(int i=0;i<size;i++){
newData[i]=data[(i+front)%data.length];}