固定长度缓冲区的读写,循环队列通常是最好的选择。如果使用普通的队列来解决固定长度缓冲区的读写问题,当队列存满时删除最早进入队列的元素存在元素移动的问题这样会增加缓存的时间复杂度。
</pre><pre name="code" class="java">class Queue{
int N; //队列中可以容纳的数量
int[] Array;
int tail; //循环队列队尾
int head; //循环队列队头
Queue(int N){
tail=0;
head=0;
this.N=N;
Array=new int[N+1];
}
/**
* 向一个循环队列里添加元素,如果队列已满则覆盖队列的队元素
* @param e
*/
public void addElement(int e){
if((tail+1)%(N+1)==head){
Array[tail]=e;
tail=head;
head=(head+1)%(N+1);
}else{
Array[tail]=e;
tail=(tail+1)%(N+1);
}
}
/**
* 从一个循环队列里删除一个元素,如果队列为空则不能删除
*/
public int deleteElement(){
int e;
if(head==tail){
throw new RuntimeException("队列已空,无法继续删除元素");
}else{
e=Array[head];
head=(head+1)%(N+1);
return e;
}
}
/**
* 打印队列内容
*/
public void display(){
if(head==tail){
System.out.println("队列为空");
}else if(head<tail){
for(int i=head;i<tail;i++){
System.out.print(Array[i]+" ");
}
}else{
for(int i=head;i<N+1;i++){
System.out.print(Array[i]+" ");
}
for(int i=0;i<tail;i++){
System.out.print(Array[i]+" ");
}
}
}
}