队列专题

队列专题

前言:

开始复习学习队列,写个学习记录总结一下知识点

说实话,现在集训期间写的东西挺杂乱的,一会这个算法一会那个算法,害,只能不定期的记录=.=


目录:

每一个算法:浅谈知识点+例题讲解+题目

  • 队列queue
  • 优先队列priority_queue
  • 双端队列和单调队列

队列queue:

1、简介:STL中“先进先出”的队列容器
2、运用:

(1)定义: queue< typename > name;

(2)访问:受“先进先出”的限制,只能通过front()和back()来访问元素

注意:在进行访问操作时,一定要先判空,否则会因为队空而出现错误

(3)操作:

①入队/出队:push()/pop()

②判空:empty()

③长度:size()

(4)常见用途:在实现广搜时,用queue来代替自己手写的队列,能够提高代码的准确性

3、题目:

(1)洛谷P1443 马的遍历

(2)所有广搜的题目(偷个懒就不多列举了,相信queue也不需要例题讲解quq)


优先队列priority_queue:

1、简介:使用堆实现的默认将当前队列优先级最高的一个置于队首

2、运用:

(1)priority_queue < typename > name;

(2)访问:和队列不一样,优先队列没有front()和back(),只能通过top()来访问队首元素,也就是优先级最高的元素

(3)操作:

①入队/出队:push()和pop()

②判空:empty()

③长度:size()

(4)优先级设置:

priority_queue <typename, vector< typename >, less< typename> > name;

priority_queue <typename, vector< typename >, greater< typename> > name;

理解:

①第二个参数vector< typename >填写的是来承载底层数据结构堆(heap)的容器,其中的typename与第一个参数的typename一致

②第三个参数less< int >表示数字大的优先级越大,而greater< int >表示数字小的优先级越大(能够将最小的元素放在队首)

3、例题讲解:

任务调度
(见我的另一篇题解,简直是无良骗取访问量啊

4、题目:

(1)Codeup 任务调度

(2)洛谷P3611 [USACO17JAN]Cow Dance Show S


双端队列和单调队列:

  • 双端队列:是一个具有队列和栈性质的数据结构,它能在两端进行插入和删除(而且也只能在两端进行插入和删除)

STL中的deque是双端队列,用法如下:


(1)dq[i]:返回队列中下标为i的元素

(2)dq.front():返回队头

(3)dq.back():返回队尾

(4)dq.pop_back():删除队尾。不返回值

(5)dq.pop_front():删除队头。不返回值

(6)dq.push_back():在队尾添加一个元素

(7)dq.push_front(e):在队头添加一个元素
  • 单调队列,双端队列的经典应用,它具有如下两个特征:

(1)队列中的元素是单调有序的,且元素在队列中的顺序和原来在序列中的顺序一致(期望)

(2)单调队列的队头和队尾都能入队和出队(实现手段)

单调队列的好处:

用起来非常灵活,在很多问题中应用它可以获得优化——用单调队列处理时,每个元素只需要进出队列一次,复杂度是 O(n)。

  • 例题讲解:

滑动窗口/【模板】 单调队列
(再一次见我的另一篇题解qwq)

  • 题目:

(1)滑动窗口/【模板】 单调队列

(2)洛谷P1714 切蛋糕

(3)洛谷P2629 好消息,坏消息

(4)洛谷P2422 良好的感觉


posted @ 2020-06-10 12:46  Eleven谦  阅读(120)  评论(0编辑  收藏  举报