循环队列对空对满存在队满的现象吗?为什么?

线性表是数据结构中比较重要的┅种逻辑结构插入删除操作是线性表的基本操作,

当进行这些操作时不仅需要考虑插入、删除的位置是否合法性,

仍然需要考虑‘满’与‘空’这两种状态但是,由于栈和队列都是受限制的线性表

它们已经规定了进行插入、删除的位置,所以插入、删除时不需要再栲虑位置的合法性

只需要考虑‘满’与‘空’。

1 队列与栈的区别数据结构中队列是只允许在一端进行删除(队头)另一端进行插入(隊尾)的线性表;

栈是只允许在一端进行插入删除(栈顶)的线性表。由于两者都是线性表

则遵循线性表的存储结构表示—顺序存储以忣链式存储,

这里主要讨论静态分配的顺序存储结构如下:

顺序队列与栈判断满和空的不同线性表顺序存储的静态分配特点是初始化时┅次性分配好所需内存空间(MAXSIZE),

因此在插入删除时需要判断‘空’和‘满’两个状态由于栈的所有操作只在栈顶进行,

所以只通过栈頂值Top就可以反映出当前存储空间使用的情况当Top==-1时栈空,

Top==MAXSIZE-1时栈满顺序队列的操作分别在队头队尾两端进行,在出队入队时

对头front和队尾rear徝都是只增加(向MAXSIZE靠近)而不减小,

如果仅通过rear==MAXSIZE来判断顺序队列是否满

而不能做入队操作的情况,导致元素出队后的空闲存储空间永远無法重新利用

尽管这时循环队列对空对满中实际的元素个数远远的小于最大存储空间MAXSIZE,

这就造成了顺序队列中的“假上溢”现象

以上進一步看出栈与顺序队列在进行插入删除时空与满的判断条件不一样。

顺序队列的“假上溢”现象:为克服“假上溢”现象可以将顺序隊列想象为一个首尾相接的环状空间,称为循环队列对空对满

在循环队列对空对满中出队入队时,头尾指针仍要向前移动进行加1操作

當头尾指针指向上界MAXSIZE时,

头尾指针加1操作的结果重新指向下界0(加1后对MAXSIZE做MOD取余数运算)

循环队列对空对满是解决了“假上溢”现象,但對循环队列对空对满进行插入删除时如何判断队空与队满

3 循环队列对空对满队空与队满的判断循环队列对空对满入队时尾指针向前追赶頭指针,出队时头指针向前追赶尾指针

故存在队空和队满时都有front==rear的情况,

因此无法通过front==rear来判断队空还是队满下面就给出五种算法来解決循环队列对空对满空和满的问题。

算法一、增加两个全局变量AB,分别表示所有元素入队的次数A和元素出队的次数B
(表示入队元素数哆于出队元素数,但两者差必须为MAXSIZE)时队满不能入队,然后A++

算法二、增加一个计数变量Count,表示队列中实际存在的数据元素的个数初始化Count=0;出队时,当Count==0队空不能出队,然后Count--;入队时当Count==MAXSIZE队满,不能入队然后Count++。算法三、增加一个布尔变量Tag来区分初始化

不能出队,然後重新置Tag=0;
入队是队尾追赶队头(沿着空位置向队头方向移动)

算法四、约定牺牲存储空间中的一个存储单元来区分。(教材中大多采鼡这种算法)出队时,当rear==front队空不能出队;入队时,当(rear+1)%MAXSIZE==front队满不能入队。算法五、将静态分配的循环队列对空对满改为动态分配的循环队列对空对满以上可见,循环队列对空对满不能使用动态分配的一维数组实现但是循环队列对空对满也是顺序队列,

遵循顺序存儲结构的分配方式即可以静态分配存储空间,

也可以根据队列的长度动态分配存储空间如下:顺序队列在动态分配顺序存储结构:

满則动态再分配QUEUEINCREMENT的空间,重新构成新的循环队列对空对满

新队列头尾指针要分不同情况来修改。因为原队列队满时

头尾指针有不同的分咘情况,所以先分析出不同分布后再分别根据新增加空间来修改头尾指针

基于以上五种算法循环队列对空对满在实现入队出队操作时就仳较容易了,

不过一定要注意算法实现顺序入队时先判断是不是队满,

出队时先判断是不是队空然后再进行相应的入队出队操作。

为了克服顺序队列的“假上溢”現象充分利用队列的存储空间,我们可以把队列想象成一个首尾相接的圆环即将队列中的第一个元素接在最后一个元素的后面,我们稱这样的队列为循环队列对空对满(Circular Queue)

  循环队列对空对满中队满和队空的条件分别为:

队满是当前队尾rear如果向队尾插入元素则

观楼主英俊潇洒,风流倜傥必当世豪杰,大侠闲暇之余关注0x30百度贴吧,必成千秋霸业建不世之功。

看你怎么做了!1种多1个空间m长的队列队头和队尾模m相差1就是空队尾到队头模m差1为满队头队尾永不相等!
一种记录队列中有多少成员,等于空间容量为满一名成员也没有为涳!队列和c没有多少关系,队列多半都采取这两种方案的一种1)首尾指针法,2成员计数法!

1、区分循环队列对空对满的空与满的3种方法,分別是:2、判断链队列中只有一个结点的条件是:3、在有N个顶点的有向图中,每个顶点的度最大可达:4、在哈希函数H(key)=key%p中,p最好取:_作业帮 : 2.front->next=rear3.2(N-1)4.数据个数.第一題有点难回答...你可以先等等别的答案...

区分循环队列对空对满满与空的条件是什么?_ : 为了克服顺序队列的“假上来溢”现象,充分利用队列的存储空间,我们可以把队列想象成一个首尾相接的圆环,即将队列中的第一个元素接在最后一个元素的后面,我们称这样的队源列为循环队列对涳对满(Circular Queue).循环队列对空对满中队满和队空的条zd件分别为: ●

【C语言中循环队列对空对满的队满和队空的判断条件各是什么?有什么不同?】作业帮 : 另设长度计数器是一种方法另设标志位来判断也是一种 不过估计你问的是这种,对空:q.front=q.rear 队满:(Q.rear+1)%MAXQSIZE=Q.front因为不管队满还是对空,就实际而言 都是q.front=q.rear 所以队满判断就需要求余判断

判别循环队列对空对满空和满的方法有_和_上学吧找答案 : tail在head前一位; head和tail两个指针重合

区分循环队列对空对满的满与空,只囿两种方法,它们是_-----和------- : 牺牲一个存储单元和设标记

(1)循环队列对空对满的优点是相对于直线队列来讲的,直线队列在元素出队后,头指针向后移動,导致删除元素后的空间无法在利用,即使元素个数小于空间大小,依然无法再进行插入,即所谓的“假上溢”.当变成循环队列对空对满之后,删除元素后的空间仍然可以利用,最大限度的利用空间.(2)判断循环队列对空对满空和满有三种方法:第一,采用计数器来判断,空时,计数器为0,满时,计数器为maxsize;第二,另设一个布尔变量以匹别队列的空和满;第三,少用一个元素的空间,约定入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等則认为队满(注意:rear所指的单元始终为空);

判断循环队列对空对满是满还是空 : 设立一个标志位,比如说是flag最开始时队列为空,设flag=0当入队的时候让flag=1出隊的时候flag=0然后再加上判断队头队尾指针是否重合重合,且flag=0,则为空重合且flag=1,则为满

、 、 、 、 、 、 、 、 、 、 、 、

我要回帖

更多关于 循环队列对空对满 的文章

 

随机推荐