读书人

※数据结构※→☆线性表构造(queue)

发布时间: 2013-10-08 16:46:23 作者: rapoo

※数据结构※→☆线性表结构(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)

循环队列

为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。

※数据结构※→☆线性表构造(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)


条件处理

循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是"空"还是"满"。

解决这个问题的方法至少有三种:
① 另设一布尔变量以区别队列的空和满;

② 另一种方式就是数据结构常用的: 队满时:(rear+1)%n==front,n为队列长度(所用数组大小),由于rear,front均为所用空间的指针,循环只是逻辑上的循环,所以需要求余运算。如图情况,队已满,但是rear(5)+1=6!=front(0),对空间长度求余,作用就在此6%6=0=front(0)。

③ 设队列中元素个数大小,和内存大小个数。判断比较二个值是否相等。.

②、③判断代码


顺序存储结构

在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构. 


顺序存储结构是存储结构类型中的一种,该结构是把逻辑上相邻的节点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储结构为顺序存储结构,通常顺序存储结构是借助于计算机程序设计语言(例如c/c++)的数组来描述的。


顺序存储结构的主要优点是节省存储空间,因为分配给数据的存储单元全用存放结点的数据(不考虑c/c++语言中数组需指定大小的情况),结点之间的逻辑关系没有占用额外的存储空间。采用这种方法时,可实现对结点的随机存取,即每一个结点对应一个序号,由该序号可以直接计算出来结点的存储地址。但顺序存储方法的主要缺点是不便于修改,对结点的插入、删除运算时,可能要移动一系列的结点。

优点:

随机存取表中元素。缺点:插入和删除操作需要移动元素。


本代码默认list可以容纳的item数目为100个,用户可以自行设置item数目。当list饱和时,会自动以2倍的长度进行递增。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以后的笔记潇汀会尽量详细讲解一些相关知识的,希望大家继续关注我的博客。
本节笔记到这里就结束了。


潇汀一有时间就会把自己的学习心得,觉得比较好的知识点写出来和大家一起分享。
编程开发的路很长很长,非常希望能和大家一起交流,共同学习,共同进步。
如果文章中有什么疏漏的地方,也请大家指正。也希望大家可以多留言来和我探讨编程相关的问题。
最后,谢谢你们一直的支持~~~


C++完整个代码示例(代码在VS2005下测试可运行)

※数据结构※→☆线性表构造(queue)☆============循环队列 顺序存储结构(queue circular sequence)(十)


AL_QueueCircularSeq.h

#ifdef TEST_AL_QUEUECIRCULARSEQAL_QueueCircularSeq<DWORD> cQueueCircularSeq(1);BOOL bEmpty = cQueueCircularSeq.IsEmpty();std::cout<<bEmpty<<std::endl;DWORD dwSize = cQueueCircularSeq.Size();std::cout<<dwSize<<std::endl;DWORD dwFront = cQueueCircularSeq.Front();std::cout<<dwFront<<std::endl;DWORD dwBack = cQueueCircularSeq.Back();std::cout<<dwBack<<std::endl;DWORD dwPop = cQueueCircularSeq.Pop();std::cout<<dwPop<<std::endl;cQueueCircularSeq.Push(999);bEmpty = cQueueCircularSeq.IsEmpty();std::cout<<bEmpty<<std::endl;dwSize = cQueueCircularSeq.Size();std::cout<<dwSize<<std::endl;dwFront = cQueueCircularSeq.Front();std::cout<<dwFront<<std::endl;dwBack = cQueueCircularSeq.Back();std::cout<<dwBack<<std::endl;dwPop = cQueueCircularSeq.Pop();std::cout<<dwPop<<std::endl;for (DWORD dwCnt=1; dwCnt<5; dwCnt++) {cQueueCircularSeq.Push(dwCnt);dwBack = cQueueCircularSeq.Back();std::cout<<dwBack<<std::endl;}dwPop = cQueueCircularSeq.Pop();std::cout<<dwPop<<std::endl;dwPop = cQueueCircularSeq.Pop();std::cout<<dwPop<<std::endl;for (DWORD dwCnt=5; dwCnt<16; dwCnt++) {cQueueCircularSeq.Push(dwCnt);dwBack = cQueueCircularSeq.Back();std::cout<<dwBack<<std::endl;}dwSize = cQueueCircularSeq.Size();std::cout<<dwSize<<std::endl;dwFront = cQueueCircularSeq.Front();std::cout<<dwFront<<std::endl;while (0x00 != cQueueCircularSeq.Size()) {dwPop = cQueueCircularSeq.Pop();std::cout<<dwPop<<std::endl;}bEmpty = cQueueCircularSeq.IsEmpty();std::cout<<bEmpty<<std::endl;dwSize = cQueueCircularSeq.Size();std::cout<<dwSize<<std::endl;dwFront = cQueueCircularSeq.Front();std::cout<<dwFront<<std::endl;dwBack = cQueueCircularSeq.Back();std::cout<<dwBack<<std::endl;dwPop = cQueueCircularSeq.Pop();std::cout<<dwPop<<std::endl;#endif











读书人网 >编程

热点推荐