※数据结构※→☆线性表结构(queue)☆============优先队列 顺序存储结构(queue priority sequence)(十一)
优先队列(priority queue)
普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高进先出 (largest-in,first-out)的行为特征。
例如下图:任务的优先权及执行顺序的关系

优先队列是0个或多个元素的集合,每个元素都有一个优先权或值
时间复杂度
有序链表(即顺序存储结构),则插入时找插入点的时间复杂度为O(n)
直接出链表表头(也就是队头元素)的时间复杂度为O(1)
======================================================================================================
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。
队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表
(1)允许删除的一端称为队头(Front)。
(2)允许插入的一端称为队尾(Rear)。
(3)当队列中没有元素时称为空队列。
(4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。
队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾(即不允许"加塞"),每次离开的成员总是队列头上的(不允许中途离队),即当前"最老的"成员离队。

顺序存储结构
在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构.
顺序存储结构是存储结构类型中的一种,该结构是把逻辑上相邻的节点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系由存储单元的邻接关系来体现。由此得到的存储结构为顺序存储结构,通常顺序存储结构是借助于计算机程序设计语言(例如c/c++)的数组来描述的。
顺序存储结构的主要优点是节省存储空间,因为分配给数据的存储单元全用存放结点的数据(不考虑c/c++语言中数组需指定大小的情况),结点之间的逻辑关系没有占用额外的存储空间。采用这种方法时,可实现对结点的随机存取,即每一个结点对应一个序号,由该序号可以直接计算出来结点的存储地址。但顺序存储方法的主要缺点是不便于修改,对结点的插入、删除运算时,可能要移动一系列的结点。
优点:
随机存取表中元素。缺点:插入和删除操作需要移动元素。
本代码默认list可以容纳的item数目为100个,用户可以自行设置item数目。当list饱和时,会自动以2倍的长度进行递增。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以后的笔记潇汀会尽量详细讲解一些相关知识的,希望大家继续关注我的博客。
本节笔记到这里就结束了。
潇汀一有时间就会把自己的学习心得,觉得比较好的知识点写出来和大家一起分享。
编程开发的路很长很长,非常希望能和大家一起交流,共同学习,共同进步。
如果文章中有什么疏漏的地方,也请大家指正。也希望大家可以多留言来和我探讨编程相关的问题。
最后,谢谢你们一直的支持~~~
C++完整个代码示例(代码在VS2005下测试可运行)

AL_QueuePrioritySeq.h
#ifdef TEST_AL_QUEUEPRIORITYSEQAL_QueuePrioritySeq<DWORD> cQueuePrioritySeq(1);BOOL bEmpty = cQueuePrioritySeq.IsEmpty();std::cout<<bEmpty<<std::endl;DWORD dwSize = cQueuePrioritySeq.Size();std::cout<<dwSize<<std::endl;DWORD dwFront = cQueuePrioritySeq.Front();std::cout<<dwFront<<std::endl;DWORD dwBack = cQueuePrioritySeq.Back();std::cout<<dwBack<<std::endl;DWORD dwPop = cQueuePrioritySeq.Pop();std::cout<<dwPop<<std::endl;cQueuePrioritySeq.Push(999);bEmpty = cQueuePrioritySeq.IsEmpty();std::cout<<bEmpty<<std::endl;dwSize = cQueuePrioritySeq.Size();std::cout<<dwSize<<std::endl;dwFront = cQueuePrioritySeq.Front();std::cout<<dwFront<<std::endl;dwBack = cQueuePrioritySeq.Back();std::cout<<dwBack<<std::endl;dwPop = cQueuePrioritySeq.Pop();std::cout<<dwPop<<std::endl;DWORD dwTestNum[]={14,10,56,7,83,22,36,91,3,47,72,0,91,100,7};for (DWORD dwCnt=0; dwCnt<(sizeof(dwTestNum)/sizeof(DWORD)); dwCnt++) {cQueuePrioritySeq.Push(dwTestNum[dwCnt]);dwBack = cQueuePrioritySeq.Back();std::cout<<dwTestNum[dwCnt]<<std::endl;}dwSize = cQueuePrioritySeq.Size();std::cout<<dwSize<<std::endl;for (DWORD dwCount=0; dwCount<dwSize; dwCount++) {dwPop = cQueuePrioritySeq.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 = cQueuePrioritySeq.IsEmpty();std::cout<<bEmpty<<std::endl;dwSize = cQueuePrioritySeq.Size();std::cout<<dwSize<<std::endl;dwFront = cQueuePrioritySeq.Front();std::cout<<dwFront<<std::endl;dwBack = cQueuePrioritySeq.Back();std::cout<<dwBack<<std::endl;dwPop = cQueuePrioritySeq.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;sMySelfData sData5;AL_QueuePrioritySeq<sMySelfData> cQueuePrioritySeqMy;cQueuePrioritySeqMy.Push(sData1);cQueuePrioritySeqMy.Push(sData2);cQueuePrioritySeqMy.Push(sData3);cQueuePrioritySeqMy.Push(sData4);dwSize = cQueuePrioritySeqMy.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 = cQueuePrioritySeqMy.Pop();std::cout<<sData.dwPriority<<" "<<sData.dwValue<<std::endl;}#endif