循环队列:为了将顺序队列底层数组中已删除元素所占用的空间重新利用,消除可能出现的“假满”现象。
package MyJava2;
import java.util.Arrays;
public class LoopQueue {
private int DEFAULT_SIZE=10;
private int capacity;
private String[] elelments;
private int front=0;
private int rear=0;
public LoopQueue(){
capacity=DEFAULT_SIZE;
elelments=new String[capacity];
}
public LoopQueue(String data){
capacity=DEFAULT_SIZE;
elelments=new String[capacity];
elelments[0]=data;
rear++;
}
public LoopQueue(String data,int initionalize){
capacity=1;
while (capacity<initionalize){
capacity<<=1;
}
elelments=new String[capacity];
elelments[0]=data;
rear++;
}
public int len(){
if(empty()){
return 0;
}else {
return rear>front?rear-front:capacity-(front-rear);
}
}
public void add(String data){
if(rear==front&&elelments[rear]!=null){
throw new IndexOutOfBoundsException("队列已满");
}
elelments[rear++]=data;
rear=rear==capacity?0:rear;//如果rear已经到头,则转头
}
public String remove(){
if (empty()){
throw new IndexOutOfBoundsException("队列为空");
}
String old=elelments[front];
elelments[front++]=null;
front=front==capacity?0:front;//若front到头,则转头
return old;
}
public String getFront(){
if (empty()){
throw new IndexOutOfBoundsException("队列为空");
}
return elelments[front];
}
public boolean empty() {
return rear==front&&elelments[rear]==null;
}
public void clear(){
Arrays.fill(elelments,null);
front=0;
rear=0;
}
public String toString(){
if(front<rear){//有效元素为front到rear之间的元素
StringBuffer sb=new StringBuffer();
for(int i=front;i<rear;i++){
sb.append(elelments[i].toString()+",");
}return sb.toString();
}else {//front>=rear,有效元素为front->capacity和0->rear之间的元素
StringBuffer sb=new StringBuffer();
for(int i=front;i<capacity;i++){
sb.append(elelments[i].toString()+",");
}
for(int i=0;i<rear;i++){
sb.append(elelments[i].toString()+",");
}return sb.toString();
}
}
public static void main(String[] args) {
LoopQueue queue=new LoopQueue("A",3);
queue.add("B");
queue.add("C");
System.out.println(queue.toString());
System.out.println(queue.len());
queue.remove();
queue.add("A1");
System.out.println(queue.toString());
System.out.println(queue.len());
}
}