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

如题所述

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

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

下面是一个实例, 不过这个实现会浪费一个元素的存储空间。如果不想浪费队列的存储空间, 就需要设置一个监视变量。
public class Queue<T> {
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;
}
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-05-18
假溢出就是指队列还有可用的空间, 但是标志却已经溢出了。

...队列的“假溢出”现象?如何用循环队列解决此问题,简述其工作原理
假溢出是是队列在一端进入插入,TOP值就会增加,在另一端删除,当判断TOP==MAX-1是,就会说明已经队满,但实际在队列的另一端还是有存储空间的,这就是“假溢出”。解决方法:设置队列为循环队列就可以了。TOP=(TOP+1)MOD (MAX-1)。下面是一个实例, 不过这个实现会浪费一个元素的存储空间。...

什么是顺序队列的"假溢出"现象,如何解决此现象(要求简要叙述该解决方法...
顺序队列假溢出就是,随着队头出队慢慢地就会空出一个个存储单元,但是队尾一直再进,最后就是存储空间根本没用满,队列就满了!解决办法,2个,1个是空出1个存储单元出来,另一个是做成循环队列。当元素被插入到数组中下标最大的位置上之后,队列的空间就用尽了,尽管此时数组的低端还有空闲空间,这...

何谓队列的“假溢出”现象?如何解决?
造成这种现象的原因是由于队列的操作方式所致。 解决队列上溢的方法有以下几种:(1)建立一个足够大的存储空间,但这样做往往造成空间使用效率低。(2)当出现假溢出时,可采用以下几种方法: ①采用平移元素的方法。每当队列中加入一个元素时,队列中已有的元素向队头移动一 个位置(当然要有空余...

什么是队列的假溢出,如何解决
1)采用循环队列; • 2)按最大可能的进队操作次数设置顺序队列的最大元素个数; • 3)修改出队算法,使每次出队列后都把队列中剩余数据元素向队头方向移动一个位置; • 4)修改入队算法,增加判断条件,当假溢出时,把队列中的数据元素向对头移动,然后方完成入队操作。意思就...

在顺序队列操作中,什么是“假溢出”现象?怎样解决这一现象?(数据结构...
在顺序队列操作中,假溢出的现象为:当元素被插入到数组中下标最大的位置上之后,队列的空间就用尽了,尽管此时数组的低端还有空闲空间。解决:将存储队列的数组头尾相接,形成循环队列。队头、队尾指针加1时用语言的取模(余数)运算实现。队头指针进1: Q.front = (Q.front+1) % MAXQSIZE 队尾...

...叫假溢出?为什么顺序队列通常都采用顺序循环队列结构?
假溢出是由于队尾rear的值和队头front的值不能由所定义数组下界值自动转为数组上界值而产生的,解决的办法是把顺序队列所使用的存储空间构造成一个逻辑上首尾相连的循环队列。和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素。由于队列的队头和队尾的位置是变化的,设置两个指针front和rear...

循环队列是否有假溢出的问题呢?
采用循环队列是解决假溢出的途径。另外,解决队满队空的办法有三:设置一个布尔变量以区别队满还是队空;浪费一个元素的空间,用于区别队满还是队空;使用一个计数器记录队列中元素个数(即队列长度);我们常采用法②,即队头指针、队尾指针中有一个指向实元素,而另一个指向空闲元素。判断循环队列队...

假溢出解决办法
在处理假溢出问题时,有两种主要的方法可供选择。首先,你可以通过“元素平移”策略来操作队列。当需要插入或删除元素时,你可以将队列中不需要的元素向前移动,腾出空间。具体操作是,将队列的前部元素移动到 rear-front-1 个位置,这样可以确保队列的正确性。另一种方法是采用循环队列的机制。在这种...

数据结构—队列(Queue)的原理以及Java实现案例
循环队列解决了假溢出的问题,同时入队和出队时间都是O(1)。此时需要考虑的就只是数组的容量有限的问题了。2.2 数组循环队列的简单实现\/***数组实现的循环队列,为了方便,这里底层数组设计为不可扩展*\/publicclassMyArrayLoopQueue<E>{\/***采用数组实现链式存储*\/privatefinalObject[]elements;\/***容量*\/privatefina...

假溢出的解决办法
在循环队列下,仍定义front=rear时为队空,而判断队满则用两种办法,一是用“牺牲一个单元”,即rear+1=front(准确记是(rear+1)%m=front,m是队列容量)时为队满。另一种解法是“设标记”方法,如设标记tag,tag等于0情况下,若删除时导致front=rear为队空;tag=1情况下,若因插入导致front=...

相似回答