杂七杂八
今天学习了队列,队列的思路和栈差不多,他只是先进先出(FIFO)的方式。他的主要操作和栈有:IsEmpty判断空,EnQueue入队,(栈是push,不过没有什么大的区别)。DeQueue出队。其核心数据也是很相似,也有一个数据区域nData,不过他是队头nHand和队尾nTail。对头定位着将要出队的元素,队尾对应着入队的元素。实现细节:也是为了能使操作简单一些,我们开始都从0开始,nTail指向的是入队时候数据要加的位置,也就是说他是先把该位置设置为入队的值,然后自己再加1.nData[nTail] = shuju; nTail++;这种方式。nHead指向的就是出队的位置,这样的好处就是能很快的判断队是否为空,只要nHand == nTail队就是空的了。(因为出队位置处没有数据),这样出队也很方便,只需要得到nHead指向位置的数据,然后nHead加1就可以。不过有的时候,会一边入队,一边出队,这样nTail和nHead会一直往后走,而nhead前面的区域已经自由了,没有用处,这样就浪费了空间。为了能有效地利用空间,我们可以循环用数据区域,就是当nTail 到数据区域最后的时候,我们把它回到0。这样就能很好的循环利用。不过这样就不能简单的用nTail >= nLen的方式判断队是否满了,做了一个处理,如果nTai的下一个位置就是nHead的话,我们认为队满了,nTail指向的是队末要插入的位置,如果他的下一个位置为nHead的话,则说明nHead..nTail中已经存放了数据。最多只能存放nTail位置一个数据。这里我们为什么不让他多存一个数据,使nTail == nHead得时候,才认为队满呢?这样不是更高的利用空间吗?话虽这样说,不过nTail == nHead是我们判断队是否为空的标识。如果我们把nTail == nHead也作为判断队满的标识的话,就会引起歧义,所以我选择浪费一个空间,来更方便的判断队空和队满。还有注意在入队的时候要判断队是否为满,出队的时候,要判断是否为空。奉上源代码:用数组实现的:
posted on 2009-04-29 20:56 shongbee2 阅读(3524) 评论(0) 编辑 收藏 引用 所属分类: 数据结构和算法
Powered by: C++博客 Copyright © shongbee2