思路分析
front指向队列的第一个元素,且front的初始值为0
rear指向队列最后一个元素的下一个位置,因为希望空出一个空间做约定,rear的初始值为0 注意:为什么要留有一个空位置呢 若不留有空位置,rear指向队列的末尾元素的下一个位置,会导致队满的时候与队空的时候判断条件会是一样的,都是rear == front
当队列满时,条件是(rear + 1)% maxSize = front
队列为空的条件,rear == front
这样分析时,队列中有效元素的个数为(rear + maxSize - front) % maxSize
这样就能够得到一个环形队列
代码实现
class CircleQueue{
private int maxSize
;
private int front
;
private int rear
;
private int[] shuzu
;
public CircleQueue(int maxSize
) {
this.maxSize
= maxSize
;
this.shuzu
= new int[maxSize
];
this.front
= 0;
this.rear
= 0;
}
public void addQueue(int i
){
if(isFull()){
System
.out
.println("队列满了,无法再进入了");
}else{
shuzu
[rear
] = i
;
rear
= (rear
+ 1) % maxSize
;
}
}
public void removeQueue(){
if(isEmpty()){
System
.out
.println("队列为空,无元素可以移除");
}else{
front
= (front
+ 1) % maxSize
;
}
}
public boolean isFull(){
return (rear
+ 1) % maxSize
== front
? true : false;
}
public boolean isEmpty(){
return front
== rear
? true : false;
}
public void print(){
for(int i
= front
;i
< front
+ size();i
++){
System
.out
.printf("%d\t",shuzu
[i
% maxSize
]);
}
}
public int size(){
return (rear
+ maxSize
- front
) % maxSize
;
}
}