这一次我们使用数据实现一个循环队列,循环队列除非扩容,否则数组中的空间可以重复使用,且不用移动数组中元素的位置,是一个性能比较好的数据结构。它需要注意的地方就是如果当前队列头部元素如果所在的下标不是0,且队尾的元素已经是数组末尾,则需要对数组前部空间的重复利用,需要使用(tail+1)% dataArray.length 计算出新元素应该放置的位置。
扩容的时候我是创建一个新的临时数组并将旧有的元素依次放置。
如果有不对的地方烦请各位大佬留言指正。
代码如下:
public class MyCircleQueue {
private String[] dataArray;
private int size;
private int head;
private int tail;
public MyCircleQueue(){
dataArray=new String[8];
size=0;
head=0;
tail=0;
}
public MyCircleQueue(int length){
dataArray=new String[length];
size=0;
head = 0;
tail=0;
}
//往队列尾部添加一个元素
public void append(String data){
//如果队列已满,则扩容
if(size>=dataArray.length){
expand();
head = 0;
tail=size-1;
}
if(size==0){
dataArray[0]=data;
}else{
dataArray[(tail+1)% dataArray.length]=data;
tail++;
}
size++;
}
//从队列头部出一个元素
public String remove1(){
if(size<1){
System.out.println("队列为空");
return null;
}else{
String result = dataArray[head];
if(head+1<dataArray.length){
head = head+1;
}else{
head = head+1-dataArray.length;
}
size--;
return result;
}
}
public int size(){
return size;
}
public void expand(){
String[] tempArray = new String[dataArray.length*2];
for(int i = 0;i<size;i++){
if(head+i<dataArray.length){
tempArray[i]=dataArray[head+i];
}else{
tempArray[i]=dataArray[head+i-dataArray.length];
}
}
dataArray=tempArray;
}
}
然后通过测试方法,验证队列的加减和扩容:
class MyCircleQueueTest {
public static void main(String[]args){
MyCircleQueue queue = new MyCircleQueue(2);
queue.append("111");
queue.append("222");
queue.append("333");
queue.append("444");
queue.append("5");
queue.append("6");
queue.append("7");
queue.append("8");
// queue.append("9");
String a= queue.remove1();
String b = queue.remove1();
String c = queue.remove1();
String d = queue.remove1();
String e = queue.remove1();
String f = queue.remove1();
String g = queue.remove1();
queue.append("10");
queue.append("11");
queue.append("12");
queue.append("13");
queue.append("14");
queue.append("15");
queue.append("16");
queue.append("17");
}
}
打完,手工!