回 帖 发 新 帖 刷新版面

主题:求解释下队列删除头元素的一个疑惑。

在队列删除一个头元素函数定义中  头指针加1为什么要写成 Q.front = (Q.front+1) % Q.queuesize;   而不是 Q.front=Q.front+1   ?

bool DeQueue (Queue &Q, ElemType &e)
 {
 // 若队列不空,则删除当前队列Q中的头元素,用 e 返回其值
 // 并返回TRUE;否则返回 FALSE
  if (Q.front == Q.rear)
   return FALSE; 
  e = Q.elem[Q.front];
  Q.front = (Q.front+1) % Q.queuesize;
  return TRUE;
 } 

回复列表 (共2个回复)

沙发

这种做法是在顺序队列中,为了解决伪溢出而采用的循环队列的做法,

在一个顺序队列中,当出队操作时队头指针向后索引,导致队列中实际可用空间不断减少,当队头指针指向顺序数组的最后一个单元时,即使整个数组没有存储数据,但在队列来看也是溢出(queue.front == queue.rear),这种溢出叫伪溢出。

为了解决这个问题采用循环队列,充分利用队列出队后空出来的那部分无用空间。
这种情况下,队列头为 front=(front+1)%size;队尾为rear=(rear+1)%size;
队列满判断为 front==(rear+1)%size;队列空仍为front==rear;队列长度为length=(rear+size-front)%size;

板凳

我明白了 谢谢老师的回复

我来回复

您尚未登录,请登录后再回复。点此登录或注册