图的广度优先遍历算法中,使用队列作为辅助数据结构

图的广度优先遍历算法中,使用队列作为辅助数据结构

本系列内容专为授课笔/面试《数据结构与算法》总结性精讲开设,图文并茂地讲解数据结构,给大家打好基础,促进对课程内容的掌握,最后成为解决问题之神,各大厂商的报价到手了!

1句子把握队列Queue0.数据结构字符分析系列1 .队列概述1.1队列特征1.2队列相关概念1.3队列操作1.4队列存储结构2.1循环队列实现抽象数据类型2.2队列2.3循环队列代码测试3.1链表节点3

0 .数据结构字符分析系列

1 .队列配置文件1.1队列的特征队列与堆栈一样是线性存储结构,具有以下特征:

根据“先进先出”原则,队列中的数据元简称FIFO结构。 在团队的末尾添加元素,在团队的开头添加元素。 1.2队列关联概念队列关联概念:

提示头和提示尾:允许插入元素的一侧称为提示尾,允许删除元素的一侧称为提示头。 入队:插入队列操作。 出队:删除队列操作。 例如,您有一个存储整数元素的队列,然后按顺序入队。 {1、2、3}

添加元素时,元素只能从团队末尾排队。 也就是说,2只能跟在1之后,3只能跟在2之后。

如果队列中的元素出队:

要素只能从队伍的开头出来。 出列的顺序为1、2、3,与入队时的顺序一致。 这就是所谓的“先进先出”。

1.3队列操作队列通常提供的操作:

入队:通常命名为push来出队。 存储结构队列通常命名为pop ),以确定队列中的元素数,并确定队列是否为空,从而获取队列的第一个元素1.4队列。存储结构队列与堆栈一样是线性结构,因此是基于常见线性表(如数组和链表)的数据结构。

文中用以数组、链表为基础的数据结构构建队列。

2 .当基于数组的循环队列实现基于数组的数据结构时,队列通常实现为循环队列。 这是因为队列的顺序存储不足。 每次从数组开头删除元素时,开头之后的所有元素都必须向前移动一个位置。 这是时间复杂性为o的操作。

可能有人会说,如果把队伍的开头标记向后移动的话,就没有必要移动要素了吧。 确实,这会导致排列空间的“流出”。

队列的插入和删除操作都是o(1)的时间复杂度,同时为了不浪费排列空间,应该使用循环队列。

循环队列是指识别数组中有前后相连的圆环,删除要素时将开头标志向后移动,添加要素时如果数组末尾已经没有空间,则考虑数组开头的空间是否有空,如果是,则插入数组开头

那么,如何判断队列是空的还是满的呢?

% E6 % A0 % 88 % E7 % a9 % ba % ef % BC % 9a % 20 % e9 % 98 % e9 % a6 % E6 % A0 % 87 % E5 % BF % 97 % 3d % e9 % 98 % 25 % 20e 7 8 % E7 % a9 % ba % E3 % 80 % 82 % E6 % A0 % 88 % E6 % bb % a1 % 20 % 3a % 20 % e9 % 98 % 9f % E5 % B0 % be 201 % 201 % bb % 20 % 20 % 88 % 20 % E5 % B0 % BD % E7 % AE % a1 % E8 % BF % 98 % E6 % 9c % 89 % E4 % b8 % 80 % E4 % b8 % aa % E7 % a9 % BF % E4 % BD % 1 % a6 % 95 % 20u blic % 3a % 20 loop queue % 28 int % 20c % 20 % 3d % 2010 % 29b % 20~loop queue % 28 % 29 % 3b public % 3a % 20 b E5 % 88 % E7 % 94 % E5 % a4 % E5 % a7 % E5 % 25 % 20ol % 20 pop % 28 % 29 % 3b % 20 % 2f % E5 % 87 % ba % e9 % 98 % 9f % E5 % 85 % 88 0 queue % 3b % 7d % 3b begin % ef % BC % 9a % e9 % 98 % e9 % AAA % 20bf % 97 capacity % ef % BC % 9a % E6 % 95 % B0 % E7 % bb % 88 8 % 97 % E7 % 9a % 84 % E6 % 93 % 8d % E4 % BD % 9c % e9 % 9d % 9e5% b8 % E7 % aa % 204 template typename % 20 tloooopqueuet % 3a % 20b % 20 queue % 20 % 3d % 20 new % 20t % 5b capacity % 5d % 3b % 3b % 20 template typename % 20 tloopqueuet % 3a % 3a~loopop 29 % 7b % 20if % 20 % 28 begin % 20 % 3d % 3d % 20 end % 29 % 20 return % 20 % 20 % 20 loop queuet % 3a % 3a size % 28 % 29 % 7b % 28 25 % 20 % 20 template typename % 20t bool % 20 loopqueuet % 3a % 3a push % 28t % 20t % 29 % 7b % 20if % 20 % 28 end % 20 % 20 % 20 % 201 % E6 % bb % a1 % 20 % 7b % 20 return % 20 false0% 20 % 20 % 25 % 20 capacity % 3b % 20 return % 20 true % 3b % 7d % 3b % 20 templatemplatin % 20 templatid 9 % 98 % 9f % E5 % 88 % 97 % E6 % 98 % af % E5 % a6 % E4 % b8 % ba7 % a9 % ba20 % 7b % 20pa city % 3b % 20 return % 20 true % 3b % 20 % 3b % 20 % 7d % 20 return % 20 queue % 5b begin % 5d % 3b % 7d % 3b 2.3 % 20 % E5 % be % aa % E7 % 8e % af % e9 % 98 % E5 % ueue.push % 28 % 27 two % 27 % 29 % 3b % 209 % 3b % 20 queue.push % 28 % 27 % 29 % 3b % 20 cout % 20 % e9 % 98f % E5 endl % 3b % 20 queue.pop % 28 % 29 % 3b % 20 % 7d % 20 getchar % 28 % 20c % ef % BC % 9a % e9 % 98 % 9f % E5 % 88 % e9 % 95 % % A8 % E5 % ae9e % E7 % B0 % E7 % 84 % e9 % 98f % E5 % 88 % ef % BC % 87c % 205 % 85 % 83 % E7 % B4 % A0 % E7 % a7 % bb % E5 % E5 % B0 % B1 % E6 % af % e9 % 93 % be8 % a1 % E5 % 209 a % e9 % 98 % 9f % E5 % B0 % be3 % 82 % 0a % E6 % 98 % be7 % B6 % E6 % E7 % E4 % b8 % ba9 % E5 % B0 % 25 % 20 % E5 % B0 % be7 % 9a % 84 % E6 % 8c % 87 % e9 % 92 % 88 % ef % BC % 8c % E6 % B9 % E4 % be4 % be4 % be8

templatetypenametclasslinkqueue { public:link queue ( ); ~LinkQueue (; bool isEmpty (; int size (; bool pop (; voidpush(t ); T front (; private: NodeT* phead; NodeT* pend; int count; (; 3.3队列的具体实现templatetypenametlinkqueuet: link queue (:phead ( nullptr ),pend ) nullptr ),count(0)0) { phead=Nam pend=phead; count=0; (; templatetypenametlinkqueuet:~link queue ( ) ) while(phead-next!=nullptr(nodet*pnode=phead; phead=phead-next; }; templatetypenametboollinkqueuet: isempty ( { return count==0; (; templatetypenametintlinkqueuet: size ( ) { return count; (; //队尾templatetypenametvoidlinkqueuet: push ( t ) ) nodet*pnode=newnodet ) t ); pend-next=pnode; pend=pnode; 出局; (; //templatetypenametboollinkqueuet: pop ( { if ( count==0) return false; NodeT* pnode=phead-next; phead-next=phead-next-next; delete pnode; count–; 返回真; (; //templatetypenamettlinkqueuet: front ( ) { return phead-next-value; (; 3.4队列的代码测试int_tmain(intargc,_TCHAR* argv[] ) { LinkQueuestring lqueue; lqueue.push(\’one ); lqueue.push(\’two ); lqueue.push(\’three ); lqueue.push(\’four ); lqueue.push(\’five ); cout \’队列大小\’ lqueue.size ( ) endl; while (! lqueue.isEmpty ( ) { cout lqueue.front ) ) endl; lqueue.pop (; ( } getchar ); 返回0; }执行结果:

队列大小5onetwothreefourfive- END –

最后,为您带来数据结构和算法优美专栏的精彩文章

请阅读:

[1]数据结构与算法|二分搜索:在剑指offer53排序数组中查找数字

[2]数据结构与算法|数据结构到底有多少种“树”? 一文钱告诉你

[3]数据结构和算法美|二分搜索:在剑指offer53排序数组中查找数字

[4] charmvecoding|cod ility-countingelevatormovements

[5] charmvecoding|thesmallestpositiveintegerthatdoesnotoccurinarraya

[6]华为开发编程测试问题及答案参考

关注微信公众:微电子研发公司获得更多精彩内容,最初从个人公众号开始。

关注“微电子研究开发公司”公众号的微信

知识星(付费群)社区旨在共享秋季招生/春季招生准备攻略、面经和内推机会、学习途径、知识题库等。

加入“微电子研发社”学习指导小组