何谓队列的“假溢出”现象?如何用循环队列解决此问题,简述其工作原理

2025-02-06 13:17:52
推荐回答(2个)
回答1:

假溢出是是队列在一端进入插入,TOP值就会增加,在另一端删除,当判断TOP==MAX-1是,就会说明已经队满,但实际在队列的另一端还是有存储空间的,这就是“假溢出”。

解决方法:设置队列为循环队列就可以了。TOP=(TOP+1)MOD (MAX-1)。

下面是一个实例, 不过这个实现会浪费一个元素的存储空间。如果不想浪费队列的存储空间, 就需要设置一个监视变量。
public class Queue {
private T[] queue;
private int front;
private int rear;

public Queue(T[] q){
this.queue = q;
this.front = 0;
this.rear = 0;
}

public boolean enqueue(T t){
if(!isFull()){
queue[rear] = t;
rear = (rear + 1) % queue.length;
return true;
}else{
throw new UnsupportedOperationException("Queue is full!");
}
}

public T dequeue(){
if(!isEmpty()){
T v = queue[front];
front = (front + 1) % queue.length;
return v;
}else{
throw new UnsupportedOperationException("Queue is empty!");
}
}

public boolean isEmpty(){
if(front == rear){
return true;
}else{
return false;
}
}

public boolean isFull(){
if(front == ((rear + 1) % queue.length)){
return true;
}else{
return false;
}
}
}

回答2:

假溢出就是指队列还有可用的空间, 但是标志却已经溢出了。