首页 > 试题广场 >

数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位

[单选题]
数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素的公式为()。
  • r-f
  • (n+f-r)% n
  • n+r-f
  • (n+r-f)% n
发表于 2017-11-06 16:31:02 回复(3)
长度等于尾指针减去头指针加上总长度然后对总长度取余
发表于 2017-05-10 19:22:48 回复(0)
如果不是循环队列的话,那就应该是 r - f , 但是如果是循环队列的话,那就算 ( n + r - f ) % n
发表于 2017-08-11 15:35:17 回复(0)
关于循环队列的一些计算问题: front为队头、rear为队尾、maxSize为队列的总容量、m为队列中元素的个数: 队空:front = rear 队满:(rear + 1) % maxSize = front 进队:front = (front + 1) % maxSize 出队:rear = (rear + 1) % maxSize 队列中元素的个数 m = (rear - front + maxSize) % maxSize
发表于 2022-01-15 00:03:19 回复(2)
可以理解为跑圈,r跑的长度是一定要不小于f的,当你看到r在f后面时,同时考虑数组容量问题,说明r已经套了f一圈,计算r比f快多少时,需要把r当前位置加上一圈跑道的长度。
发表于 2023-01-13 10:52:49 回复(0)
r > f 时,应该是A;r < f 时,应该是C。D是一般情况,包含了 r > f 和 r < f 的情况,因此选D。 
发表于 2017-06-01 16:13:31 回复(0)
记住循环队列,队头地址不一定比队尾高或者低的!
发表于 2022-03-06 17:51:49 回复(0)
少用一个元素空间,约定以“队列头指针front在队尾指针rear的下一个位置上”作为队列“满”状态的标志。即:
  队空时: front=rear
  队满时: (rear+1)%maxsize=front
(形成一个圆,逆时针为下一位置)
发表于 2017-08-16 09:30:45 回复(1)
循环队列长度公式推导
假设MaxSize = 10,根据rear和front的大小共有三种情况,红色代表已存储数据,绿色代表空间还未被占用
1.Q.rear > Q.front如图所示

Q.front=0, Q.rear=4,则队列中的元素个数为上图中红色部分区域,即长度等于Q.rear - Q.front= 5-0=5

2.Q.rear = Q.front
因为Q.rear一定指向空单元所以总长度为Q.rear - Q.front = 0

3.Q.rear < Q.front

如图所示Q.front=7 , Q.rear = 2,存储数据的单元为Q[7],Q[8],Q[9],Q[0],Q[1]
红色部分为已填充数据此时列表的长度就是上图中两段红色部分相加即
列表长度=MaxSize - Q.front + Q.rear
变换一下:列表长度 = Q.rear - Q.front +MaxSize
第三种情况就是在第二种情况的基础之上加MaxSize,根据数学取余的性质
(x + ky) % y = x所以循环队列的长度公式可以写成:
L = (Q.rear - Q.front + MaxSize) % MaxSize


发表于 2024-06-05 23:55:11 回复(0)
王道p74
队满条件:(Q.rear+1)%MaxSize==Q.front
队空条件:  Q.front==Q.rear
队列中元素的个数:(Q.rear-Q.front+MaxSize)%MaxSize
发表于 2022-08-15 15:40:48 回复(0)
说点能听懂的吧,因为是循环队列,所以头指针的位置不一定比尾指针的位置低,两者相减有可能会出现负数的情况,所以需要做一个取模的操作防止出现负数
发表于 2024-01-14 15:51:13 回复(0)
循环队列元素个数=(总长度+尾-头)%总长度
编辑于 2023-12-12 16:56:31 回复(0)
为什么会出现访问数组越界而报错,说明数组在编译的时候已经确定了大小,如果你觉得因为push可以向数组里添加元素,觉得是可以改变的,那么你就错了,push他有一句话是返回新数组,那么就是原来那个数组不用了,我再重新生成一个新规定的数组,再补充一点为什么数组的查询速度比链表的查询速度要快,大家可能以为时间复杂度都是O(n),但其实不然,实际上数组的查询速度是比链表要快的,为什么呢?这就涉及到cpu与内存之间的关系了,大家在工作中最常听的一句话就是拿到内存中去处理,而不是频繁的与硬盘进行IO上的交互,与这个道理类似,因为CPU在缓存上的处理速度要比在内存上快,同时缓存中只能存储内存地址连续的元素,因为数组在内存中数据地址是连续的,所以CPU可以直接在缓存中处理数组,而链表只能在内存中进行处理,效率上会慢一些。
编辑于 2022-06-16 12:35:14 回复(0)
D
发表于 2021-11-09 11:14:52 回复(0)
什么?_?假如容量为10,但循环队列中现有元素个数为9,即如果f=9,n=10,r=0呢?
发表于 2017-07-14 20:58:36 回复(2)