线性队列和环形队列的优缺点不再描述,其实环形有很多东西和线性队列是一样的,但是稍微有一点差异。
front:表示的意思是指向队列的头位置的前一个位置的指针。
rear:表示的意思是指向队列的尾部位置的指针。
原因:因为当rear=front的时候,此时可能会出现两种情况,一种是为空,一种是为满,此时需要拿出一个位置来进行判断,由于一般队列的情况是先为空,后向队列中添加元素,最后为满,则这种情况不会与之前的rear=front有两种为空为满的情况发生冲突。所以拿出一个位置这种想法合情合理。
1 若队列为空时:front=rear
2 若队列为满时,(rear+1)%front=front
相关图像:
两者最好写成这样的形式,而最好不要写rear++,front++!!!因为这是一个环,如果指针到了末尾需要前进一位,则需要%maxSize。这样更合理。
public class Test {
public static void main(String[] args){
CircleQueue c =new CircleQueue(5);
c.add(3);
c.add(4);
c.add(5);
System.out.println("遍历后的元素是");
c.list();
c.del();
System.out.println("遍历后的元素是");
c.list();
}
}
class CircleQueue {
int maxSize;
int a[];
int front;
int rear;
public CircleQueue(int maxSize) {
front=0;
rear=0;
this.maxSize = maxSize;
a = new int[this.maxSize];
}
//判断队列是否为空。
public boolean isEmpty(){
return front == rear;
}
//判断队列是否已满。
public boolean isFull(){
return (rear+1)%maxSize==front;
}
//定义一个添加元素的方法。
public void add(int value){
if(isFull()){
System.out.println("队列已满,无法继续添加元素");
}
else {
rear=(rear+1)%maxSize;
a[rear]=value;
}
}
//定义一个删除元素的方法。
public void del(){
if(isEmpty()){
System.out.println("队列为空,无法继续删除元素");
}
front=(front+1)%maxSize;
}
//定义一个遍历元素的方法。
public void list(){
if(isEmpty()){
System.out.println("队列中没有元素,无法遍历");
}
else{
for(int i=front+1;i<=rear;i++){
System.out.println(a[i]);
}
}
}
}