/**
* 数组实现循环队列
*
*/
public class LoopQueue<T> {
private Object[] elements;
int capacity;
int head;
int rear;
public LoopQueue(int capacity) {
this.elements = new Object[capacity];
this.capacity = capacity;
}
public boolean isEmpty() {
return head == rear && elements[head] == null;
}
public boolean isFull() {
return head == rear && elements[head] != null;
}
public void offer(T value) {
if(isFull()){
System.out.println("队列已满!");
return;
}
elements[rear] = value;
rear++;
rear = (rear == capacity) ? 0 : rear;
}
public T poll() {
if(isEmpty()){
System.out.println("队列为空!");
return null;
}
T value = (T)elements[head];
elements[head] = null;
head++;
head = (head == capacity) ? 0 : head;
return value;
}
public int size() {
if(isEmpty()) return 0;
return rear-head>0 ? rear-head : capacity-(head-rear);
}
public String print() {
if(isEmpty()) return null;
StringBuilder sb = new StringBuilder();
for(int i = 0; i < size(); i++) {
sb.append(elements[(head+i)%capacity].toString() + " ");
}
return sb.toString().substring(0, sb.length()-1);
}
public static void main(String[] args) {
LoopQueue<String> lq = new LoopQueue<String>(5);
lq.offer("a");lq.offer("b");lq.offer("c");
System.out.print(lq.head+" ");System.out.println(lq.rear);//0 3
System.out.println(lq.print());//a b c
lq.poll();
System.out.print(lq.head+" ");System.out.println(lq.rear);//1 3
System.out.println(lq.print());//b c
lq.offer("d");lq.offer("e");lq.offer("f");
lq.offer("g");//此时应队列满
System.out.print(lq.head+" ");System.out.println(lq.rear);//1 1
System.out.println(lq.isFull());//true
System.out.println(lq.size());//5
System.out.println(lq.print());//b c d e f
lq.poll();lq.poll();
System.out.print(lq.head+" ");System.out.println(lq.rear);//3 1
System.out.println(lq.size());//3
System.out.println(lq.print());//d e f
lq.offer("h");
System.out.print(lq.head+" ");System.out.println(lq.rear);//3 2
System.out.println(lq.size());//4
System.out.println(lq.print());//d e f h
lq.poll();lq.poll();lq.poll();lq.poll();
System.out.print(lq.head+" ");System.out.println(lq.rear);//2 2
System.out.println(lq.size());//0
System.out.println(lq.isEmpty());//true
System.out.println(lq.print());//null
}
}