首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2013-10-08 
※数据结构※→☆线性表结构(queue)☆优先循环队列顺序存储结构(queue priority circular sequence

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

优先队列(priority queue)
        普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高进先出 (largest-in,first-out)的行为特征。

        例如下图:任务的优先权及执行顺序的关系
        ※数据结构※→☆线性表构造(queue)☆============优先循环队列  顺序存储结构(queue priority circular sequence)(十三)

        优先队列是0个或多个元素的集合,每个元素都有一个优先权或值

时间复杂度

        有序链表(即顺序存储结构),则插入时找插入点的时间复杂度为O(n)
        直接出链表表头(也就是队头元素)的时间复杂度为O(1)


       这里要特别注意Push时,内存溢出的问题。

                由于我写的逻辑里有减号“-”,因此对所有减的情况都进行了负值判断。

                当然,你也可以有别的逻辑处理,如果只是加号“+” 的话,不需要作判断的,只要在最后取余“%”就行了。




条件处理

        循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件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 priority circular sequence)(十三)


AL_QueuePriorityCircularSeq.h

#ifdef TEST_AL_QUEUEPRIORITYCIRCULARSEQAL_QueuePriorityCircularSeq<DWORD> cQueuePriorityCircularSeq(1);BOOL bEmpty = cQueuePriorityCircularSeq.IsEmpty();std::cout<<bEmpty<<std::endl;DWORD dwSize = cQueuePriorityCircularSeq.Size();std::cout<<dwSize<<std::endl;DWORD dwFront = cQueuePriorityCircularSeq.Front();std::cout<<dwFront<<std::endl;DWORD dwBack = cQueuePriorityCircularSeq.Back();std::cout<<dwBack<<std::endl;DWORD dwPop = cQueuePriorityCircularSeq.Pop();std::cout<<dwPop<<std::endl;cQueuePriorityCircularSeq.Push(999);bEmpty = cQueuePriorityCircularSeq.IsEmpty();std::cout<<bEmpty<<std::endl;dwSize = cQueuePriorityCircularSeq.Size();std::cout<<dwSize<<std::endl;dwFront = cQueuePriorityCircularSeq.Front();std::cout<<dwFront<<std::endl;dwBack = cQueuePriorityCircularSeq.Back();std::cout<<dwBack<<std::endl;dwPop = cQueuePriorityCircularSeq.Pop();std::cout<<dwPop<<std::endl;DWORD dwTestNum[]={14,10};for (DWORD dwCnt=0; dwCnt<(sizeof(dwTestNum)/sizeof(DWORD)); dwCnt++) {cQueuePriorityCircularSeq.Push(dwTestNum[dwCnt]);std::cout<<dwTestNum[dwCnt]<<std::endl;}dwPop = cQueuePriorityCircularSeq.Pop();std::cout<<dwPop<<std::endl;DWORD dwTestNum2[]={56,3,1};for (DWORD dwCnt=0; dwCnt<(sizeof(dwTestNum2)/sizeof(DWORD)); dwCnt++) {cQueuePriorityCircularSeq.Push(dwTestNum2[dwCnt]);std::cout<<dwTestNum2[dwCnt]<<std::endl;}dwPop = cQueuePriorityCircularSeq.Pop();std::cout<<dwPop<<std::endl;dwPop = cQueuePriorityCircularSeq.Pop();std::cout<<dwPop<<std::endl;DWORD dwTestNum3[]={100,11,7,999};for (DWORD dwCnt=0; dwCnt<(sizeof(dwTestNum3)/sizeof(DWORD)); dwCnt++) {cQueuePriorityCircularSeq.Push(dwTestNum3[dwCnt]);std::cout<<dwTestNum3[dwCnt]<<std::endl;}dwPop = cQueuePriorityCircularSeq.Pop();std::cout<<dwPop<<std::endl;dwPop = cQueuePriorityCircularSeq.Pop();std::cout<<dwPop<<std::endl;dwPop = cQueuePriorityCircularSeq.Pop();std::cout<<dwPop<<std::endl;DWORD dwTestNum4[]={65,111,1032,97,7,56,1,0,66};for (DWORD dwCnt=0; dwCnt<(sizeof(dwTestNum4)/sizeof(DWORD)); dwCnt++) {cQueuePriorityCircularSeq.Push(dwTestNum4[dwCnt]);std::cout<<dwTestNum4[dwCnt]<<std::endl;}dwSize = cQueuePriorityCircularSeq.Size();std::cout<<dwSize<<std::endl;for (DWORD dwCount=0; dwCount<dwSize; dwCount++) {dwPop = cQueuePriorityCircularSeq.Pop();std::cout<<dwPop<<std::endl;}struct sMySelfData {BOOL operator > (sMySelfData sData) const{return this->dwPriority > sData.dwPriority;}DWORD dwPriority;DWORD dwValue;};// class sMySelfData {// public:// BOOL operator > (sMySelfData sData) const{// return this->dwPriority > sData.dwPriority;// }// DWORD dwPriority;// DWORD dwValue;// };bEmpty = cQueuePriorityCircularSeq.IsEmpty();std::cout<<bEmpty<<std::endl;dwSize = cQueuePriorityCircularSeq.Size();std::cout<<dwSize<<std::endl;dwFront = cQueuePriorityCircularSeq.Front();std::cout<<dwFront<<std::endl;dwBack = cQueuePriorityCircularSeq.Back();std::cout<<dwBack<<std::endl;dwPop = cQueuePriorityCircularSeq.Pop();std::cout<<dwPop<<std::endl;//test myself datasMySelfData sData1;memset(&sData1, 0x00, sizeof(sMySelfData));sMySelfData sData2;memset(&sData1, 0x00, sizeof(sMySelfData));sMySelfData sData3;memset(&sData1, 0x00, sizeof(sMySelfData));sMySelfData sData4;memset(&sData1, 0x00, sizeof(sMySelfData));sData1.dwPriority = 1;sData1.dwValue = 1;sData2.dwPriority = 2;sData2.dwValue = 2;sData3.dwPriority = 3;sData3.dwValue = 3;sData4.dwPriority = 2;sData4.dwValue = 4;AL_QueuePriorityCircularSeq<sMySelfData> cQueuePriorityCircularSeqMy(1);cQueuePriorityCircularSeqMy.Push(sData1);cQueuePriorityCircularSeqMy.Push(sData2);cQueuePriorityCircularSeqMy.Push(sData3);cQueuePriorityCircularSeqMy.Push(sData4);dwSize = cQueuePriorityCircularSeqMy.Size();std::cout<<dwSize<<std::endl;sMySelfData sData;memset(&sData, 0x00, sizeof(sMySelfData));for (DWORD dwCount=0; dwCount<dwSize; dwCount++) {memset(&sData, 0x00, sizeof(sMySelfData));sData = cQueuePriorityCircularSeqMy.Pop();std::cout<<sData.dwPriority<<" "<<sData.dwValue<<std::endl;}#endif





热点排行