二级公共基础问题 关于环形队列

来源:百度知道 编辑:UC知道 时间:2024/05/14 11:06:47
数组Q[0……n]用来表示一个环形队列,f为当前排头元素的前一位置,r为队尾元素位置,假定队列中元素的个数总小于n,计算队列中元素个数的公式为______________。

可不可以具体说说 环形队列,它究竟是怎样一种队列?

答案应该是:(r-f+n)% n

首先来说下对列吧,
队列的特点是先进先出,或者后进后出。那么在语言编程中是怎么来实现的呢
可以用数组和两个指针(头指针和尾指针,但数据类型可以为整形,只是表示指向的含义)组成一个结构体来实现队列。
如:
struct squ
{
int data[10];
int r,f;
}
其中,f指向队列的头(注意不一定是数组的第一个元素),r指向队列的尾(注意也不一定是数组的最后一个元素)。
而,出队列的操作就是取出对应的位置的值,并且头指针加1,
即a=data[r],f=f+1
入队列的操作就是尾指针加1,并且把值放进对应的位置
即r=r+1,data[r]=a
这样就完成了数据结构到编程语言的转化。
但是这种数据结构存在着一个问题。
当尾指针为数组最后一个元素的时候,则数据无法进入队列,但此时,由于出队列的操作,头指针并不指向数组的第一个元素。此时,队列还有一定的存储空间,但却无法做入队列的操作,对存储空间有很大的浪费。这种现象在数据结构中称为假溢出。
为了解决这一矛盾,才产生了环形队列,环状队列在数据结构里称为循环队列。也就是把队列的尾和头接在一起形成一个环,这样当发生假溢出时,尾指针可以跳到数组的开始,重复利用那些已经从队列里删掉的存储单元。
在编程中的实现也很简单,只要对尾指针做相对于数组长度的余运算就行,
即r=r%n

那么这道题,
当尾指针在头指针的后方时(最普通的一种情况),元素个数为:r-f
当尾指针转到头指针的前方时,
r-f 长度为数组中没有使用的单元,符号为负
r-f+n 就是数组中使用的单元的个数。

现在将两种情况统一一下就为
(r-f+n) % n

注意对于求余运算
(a+n)% n = a (a<n)

以上内容可以在任何一本数据结构书中找到。