首页 > 试题广场 >

现有一循环队列,其队头指针为front,队尾指针为rear;

[单选题]
现有一循环队列,其队头指针为front,队尾指针为rear;循环队列长度为N。其队内有效长度为?(假设队头不存放数据)
  • (rear - front + N) % N + 1
  • (rear - front + N) % N
  • (rear - front) % (N + 1)
  • (rear - front + N) % (N - 1)
条件:假设队头不存放数据。
假设:N=5, rear=4, front=1

1       2          3         4       5
空     A          B        C
队头                      队尾

队列长度:(4-1+N)%N=3
(rear - front+N) % N
 队列满的条件:当队尾指向5的时候,队列满了,也就是(5+1)%5=1
(rear+1)%N=front

发表于 2015-09-05 17:07:49 回复(2)
更多回答
这道题是考虑循环队列 
对于循环队列 空间长度为N 是固定的
举个简单例子  空间 位置为 1,2,3,4,5,6, 空间长度为6
本体中 front 不存数据 
如果front <= rear  则(rear-front)> 0  实际空间长度就是 (rear-front)举例 front = 1 ,rear = 4 
如果front > rear 则(rear-front)< 0  实际长度 就是 (rear+N-front) 举例front = 5 ,rear= 2
为了统一两种情况 所以给出的结果为(rear-front+N)% N

如果front中也存放数据时
则结果为
(rear-front+1+N)% N
编辑于 2016-04-25 16:14:47 回复(3)
循环队列主要有两个坑点:
1.如果存放队列的数组够大,在没有 (rear - front + maxsize )% maxsize 这个选项的时候,用 (rear - front)% maxsize 就是最佳选项!
2.一定要注意题目中说的是长度N(maxsize = N)还是数组下标[0-N](maxsize = N+1)无论是算队空队满还是计算队列的长度用到的是队列的长度,一定要看清楚!
发表于 2018-10-24 11:52:25 回复(0)
这道题目应该是(rear - front+N) % N
发表于 2015-08-02 21:33:57 回复(14)
这个题怎么感觉怪怪的呢,不理解????
发表于 2015-09-01 19:09:03 回复(0)
答案:D
队列具有头结点,长度为N的队列有效长度为N-1
这里是循环队列,有效长度应该是(rear - front) % (N - 1)
发表于 2015-01-14 19:38:57 回复(5)
发表于 2020-05-01 11:39:02 回复(1)
循环队列有效长度,即循环队列中存放元素的个数,假设队列大小为QZ
 - 当rear>=front时,有效长度 = rear - front
 - 当rear<front时,(front - rear)代表的是队列中没有存放元素的个数,所以有效长度 = QZ - (front - rear) = rear - front + QZ
综上 有效长度  = (rear - front + QZ) % QZ
思考:为什么强调队头不存放数据?
----- 如果队头存放数据,则可能存在front = rear是队满的情况

发表于 2020-05-23 16:41:53 回复(0)

顺序存储结构的循环队列

假设循环队列的队尾指针是rear,队头是front,其中QueueSize为循环队列的最大长度。

(1) 入队时队尾指针前进1:(rear+1)%QueueSize

(2) 出队时队头指针前进1:(front+1)%QueueSize

例1, 例2

(3) 队列长度:(rear-front+QueueSize)%QueueSize

例3:

现有一循环队列,其队头指针为front,队尾指针为rear;循环队列长度为N。其队内有效长度为?(假设队头不存放数据)

答案:(rear-front+N)%N

(4) 队空和队满的条件

为了区分队空还是堆满的情况,有多种处理方式:

方式1: 牺牲一个单元来区分队空和队满,入队时少用一个队列单元,即约定以"队头指针在队尾指针的下一位置作为队满的标志"。

队满条件为:(rear+1)%QueueSize==front

队空条件为:front==rear

队列长度为:(rear-front++QueueSize)%QueueSize

方式2: 增设表示队列元素个数的数据成员size,此时,队空和队满时都有front==rear。

队满条件为:size==QueueSize

队空条件为:size==0

方式3: 增设tag数据成员以区分队满还是队空

tag表示0的情况下,若因删除导致front==rear,则队空;

tag等于1的情况,若因插入导致front==rear则队满

例1:

循环队列的存储空间为Q(1:50),初始状态为front=rear=50。
经过一系列正常的入队与退队操作后,front=rear=25。此后又插入一个元素,则循环队列中的元素个数为多少?

答案:1,或50且产生上溢错误

例2:

循环队列的存储空间为Q(1:40),初始状态为front=rear=40。
经过一系列正常的入队与退队操作后,front=rear=15,此后又退出一个元素,则循环队列中的元素个数为多少?

答案:39,或0且产生下溢错误

例3:

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

答案:0或35

例4:

循环队列的存储空间为Q(1:200),初始状态为front=rear=200。经过一系列正常的入队与退队操作后,front=rear=1 则循环队列中的元素个数为多少?

答案:0或200

例3:个人觉得这一题条件不全

最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是:rear=front
发表于 2017-05-07 14:15:45 回复(0)
对于非空队列,头指针始终指向队列头元素,而尾指针始终指向队委元素的下一个位置(这就是为什么结果不用加1的原因)。
这题不严谨,循环队列,rear-front 有可能是负值
所以答案:(rear - front + N) % N

发表于 2016-03-23 14:42:43 回复(0)
这题其实是不是可以翻译一下,当rear指向队尾元素的下一个元素,那么队长就是(rear-front+N)%N?
发表于 2023-02-04 16:55:12 回复(0)
这题的关键在于front存不存数据,如果存数据就是(rear-front+1+n)%N;否则就没有这个+1;
发表于 2021-05-04 17:09:38 回复(0)
队头不存放元素,所以要注意+1的选项。
发表于 2019-09-27 14:48:11 回复(0)
假如初始时候 
rear = 0;
front = 0;

下面这个是对的: 
(rear - front + N) % N

因为这样的初始化,front 永远指向第一个有效的元素,rear永远指向NULL,即最后一个有效元素的紧接着下一个
 
发表于 2018-08-20 12:45:53 回复(0)
一般情况front中存放数据rear中没有,队列中的数据量为(rear+m-front)/m 此处相当与下标右移 一般rear先赋值后增 此处先增后赋值
发表于 2018-08-03 18:03:09 回复(0)
  • 假设front小于rear,有效长度就是rear-front
  • 假设front大于rear,有效长度就是rear+(N-front)
  • 统一成(rear-front+N)%N
发表于 2018-02-26 15:57:30 回复(0)
应该为 (rear-front+m)%m
发表于 2016-04-09 00:45:59 回复(0)
举个例子算一下 正确答案就是B。。
发表于 2016-03-17 15:03:53 回复(0)
有效长度是指剩余的可用空间,还是已存数据占用的空间
发表于 2015-12-25 19:15:35 回复(0)
这个题到底是什么答案啊
发表于 2015-11-08 16:43:51 回复(0)