循环队列中元素个数为多少?

设循环队列的存储空间为Q(1:35),初始状态为front=rear=35.现经过一系列入队与退队运算后,front=15,rear=15,则循环队列中元素个数为多少?

答案是0或35。前提条件是:此循环队列的存储空间全部用于存储数据,而没有留出一个存储空间用于判别队满与队空。

在上述循环队列中,当front = rear时,

(1)有可能是队空:先入队15个元素,rear = 15;再出队15个元素,front = 15。

(2)有可能是队满:先入队15个元素,rear = 15;再出队15个元素,front =
 15;最后再入队35个元素,rear指针循环一圈后再次等于15。

综上,队列中元素个数为0或35。

但应注意,上述的循环队列由于无法判别队满与队空,导致其产生二义性(即有歧义),可用性降低。因此,改进的方法是少用一个存储空间,即队列最大只存储34个元素,此时可用下列方法区分队满与队空:

(1)队满:(rear + 1)% MaxSize == front

(2)队空:rear == front

计算队列的元素个数:(尾-头+表长)%表长

队列头指针为front,队列尾指针为rear,队列容量为M,则元素个数为|rear-front+M|%M,注意,这个%是求余运算。

为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。这种循环队列可以以单链表的方式来在实际编程应用中来实现。

条件处理:

循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是"空"还是"满"。

解决这个问题的方法至少有两种:

① 另设一布尔变量以区别队列的空和满;

②另一种方式就是数据结构常用的: 队满时:(rear+1)%n==front,n为队列长度(所用数组大小),由于rear,front均为所用空间的指针,循环只是逻辑上的循环,所以需要求余运算。如图情况,队已满,但是rear(5)+1=6!=front(0),对空间长度求余,作用就在此6%6=0=front(0)。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-01-08

    循环队列中元素个数的计算公式:

    #define MAXSIZE 100

    typedef struct

    {

    int * base;

    int front;

    int rear;

    }SqQueue;

    int Queuelength(SqQueue Q) //返回Q的元素个数

    {

    return(Q.rear-Q.front+MAXQSIZE)%MAXSIZE;

    }

    为充分利用向量空间,克服" 假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。这种循环队列可以以 单链表的方式来在实际编程应用中来实现。

    循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是"空"还是"满"。

    解决这个问题的方法至少有两种:① 另设一 布尔变量以区别队列的空和满。

    ②另一种方式就是数据结构常用的: 队满时:(rear+1)%n==front,n为队列长度(所用 数组大小),由于rear,front均为所用空间的指针,循环只是逻辑上的循环,所以需要求余运算。如图情况,队已满,但是rear(5)+1=6!=front(0),对空间长度求余,作用就在此6%6=0=front(0)。

第2个回答  2019-07-21
计算队列的元素个数:(尾-头+表长)%表长
队列头指针为front,队列尾指针为rear,队列容量为M,则元素个数为|rear-front+M|%M,注意,这个%是求余运算。
为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。这种循环队列可以以单链表的方式来在实际编程应用中来实现。
条件处理:
循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是"空"还是"满"。
解决这个问题的方法至少有两种:
① 另设一布尔变量以区别队列的空和满;
②另一种方式就是数据结构常用的: 队满时:(rear+1)%n==front,n为队列长度(所用数组大小),由于rear,front均为所用空间的指针,循环只是逻辑上的循环,所以需要求余运算。如图情况,队已满,但是rear(5)+1=6!=front(0),对空间长度求余,作用就在此6%6=0=front(0)。
相似回答