package p01.动态数组;
public interface Queue<E> {
public int getsize();
public boolean isEmpty();
public void enqueue(E e);
public E dequeue();
public E getFront();
public E getRear();
public void clear();
}
package p01.动态数组;
public class ArrayQueueLoop<E> implements Queue<E> {
private E[] data;
private int front; //头指针
private int rear; //尾指针
private int size;
public ArrayQueueLoop(){
this(10);
}
public ArrayQueueLoop(int capacity){
data=(E[]) new Object[capacity+1]; //rear地方只标记尾,不存元素
size=0;
front=0;
rear=0;
}
@Override
public int getsize() {
return size;
}
@Override
public boolean isEmpty() {
return front==rear;
}
@Override
public void enqueue(E e) {
if((rear+1)%data.length==front){
throw new IllegalArgumentException("队列已满");
}
data[rear]=e;
rear=(rear+1)%data.length;
size++;
}
@Override
public E dequeue() {
E res=getFront();
front=(front+1)%data.length;
size--;
return res;
}
@Override
public E getFront() {
if(isEmpty()){
throw new IllegalArgumentException("队列为空");
}
return data[front];
}
@Override
public E getRear() {
if(isEmpty()){
throw new IllegalArgumentException("队列为空");
}
if(rear==0){
//两种情况,rear如果在0的位置,说明它是取余得来,则最后一个元素在data.length-1的位置
//另一种就是rear的前一个位置就是最后一个元素
return data[data.length-1];
}else{
return data[rear-1];
}
}
@Override
public void clear() {
front=0;
rear=0;
size=0;
}
@Override
public String toString() {
if(isEmpty()){
return "[]";
}
StringBuilder sb=new StringBuilder("[");
for(int i=front;i!=rear;i=(i+1)%data.length){
if((i+1)%data.length==rear){
sb.append(data[i]+"]");
}else{
sb.append(data[i]+",");
}
}
return sb.toString();
}
}