stack要点

1.stack遵从先进后出的规则,即先进栈的元素后出栈,入栈/出栈只能在栈的一端进行

2.stack是作为容器适配器被实现的,容器适配器是对特定类进行封装,作为其底层的容器

3.stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器应支持如下操作:
·empty()——判空
·back()——获取尾部元素
·push_back()——尾部插入
·pop_back()——尾部删除

4.标准容器vectordequelist均符合第3条要求,默认情况下,使用deque作为stack的底层容器

5.stack应支持以下操作:
·stack()——构造空栈
·empty()——判断栈是否为空
·size()——返回栈元素数目
·top()——返回栈顶元素引用
·push()——元素入栈
·pop()——栈顶元素出栈

stack模拟

#include <deque>//底层默认使用deque
namespace BL{template<class T, class Con = deque<T>>class stack {public:stack() {}void push(const T& x) { _c.push_back(x); }void pop() { _c.pop_back(); }T& top() { return _c.back(); }const T& top()const { return _c.back(); }size_t size()const { return _c.size(); }bool empty()const { return _c.empty(); }private:Con _c;};
}

queue要点

1.queue遵从先进先出的规则,即先入队的元素先出队,入队只能在容器一端,出队只能在容器的另一端

2.queue是作为容器适配器被实现的

3.queue的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器应支持如下操作:
·empty()——判空
·size()——返回队内元素数目
·front()——获取首部元素
·back()——获取尾部元素
·push_back()——尾部插入
·pop_front()——首部删除

4.标准容器dequelist均符合第3条要求,默认情况下,使用deque作为queue的底层容器

5.queue应支持以下操作:
·queue()——构造空队
·empty()——判断队是否为空
·size()——返回队元素数目
·front()——返回队首元素引用
·back()——返回队尾元素引用
·push——从队尾入队
·pop——队首元素出栈

queue模拟

#include <deque>//底层默认使用deque实现
namespace BL{ template<class T, class Con = deque<T>>class queue {public:queue() {}void push(const T& x) { _c.push_back(x); }void pop() { _c.pop_front(); }T& back() { return _c.back(); }const T& back()const { return _c.back(); }T& front() { return _c.front(); }const T& front()const { return _c.front(); }size_t size()const { return _c.size(); }bool empty()const { return _c.empty(); }private:Con _c;};
}

priority_queue要点

1.priority_queue是一种容器适配器,根据严格的弱排序标准,其第一个元素总是所有元素中最大的

2.priority_queue类似堆,在堆中可以随时插入元素,且只能检索最大堆顶元素(优先队列中位于顶部的元素)

3.priority_queue是作为容器适配器被实现的,元素从特定容器的“尾部”弹出,该“尾部”称为priority_queue的顶部

4.priority_queue的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器应支持随机迭代器访问及如下操作:
·empty()——判空
·size()——返回容器中元素数目
·front()——返回容器中第一个元素的引用
·push_back()——尾部插入
·pop_back()——尾部删除

5.标准容器dequevector均符合第4条要求,默认情况下,使用vector作为priority_queue的底层容器

6.priority_queue应支持以下操作:
·priority_queue()——构造空的优先级队列
·empty()——判断队是否为空
·size()——返回队内元素数目
·top()——返回优先级最高元素的引用
·push——向优先级队列插入元素
·pop——优先级最高元素出栈

7.因支持随机迭代器访问,便于priority_queue维持堆结构,容器适配器应满足下述二者之一即可
a.存在调整算法
b.调用相应算法(make_heap,push_heap,pop_heap)

8.priority_queue<T>——底层构造大堆
priority_queue<T,vector<T>,greater<T>>——底层构造小堆

priority_queue模拟实现

#include <vector>       //底层默认使用vector实现
#include <algorithm>    //调用swap需要
#include <functional>   //greater<T>和less<T>需要namespace BL{template <class T, class Container = vector<T>, class Compare = less<T> >class priority_queue{public:priority_queue() {}template <class InputIterator>priority_queue(InputIterator first, InputIterator last):c(first,last) {//区间构造int curpos = c.size() / 2 - 1;//建堆while (curpos >= 0) _AdjustDown(curpos--);}bool empty() const { return c.empty(); }size_t size() const { return c.size(); }T& top() const { return c.front(); }void push(const T& x) { c.push_back(x);//新增一元素_AdjustUp(c.size() - 1);//向上调整算法}void pop() {if (c.empty())return;swap(c.front(), c.back());//堆顶与堆尾交换cout << c.back() << endl;c.pop_back();//堆尾出堆_AdjustDown(0);//向下调整算法}private:void _AdjustDown(int parent) {int n = c.size();if (!n)//没有元素可以调整return;int tmp = c[parent];int child = parent * 2 + 1;while (child < n) {if (child + 1 < n && comp(c[child], c[child + 1]))//寻找合适的孩子++child;if (!comp(c[parent], c[child]))//不符合交换条件break;c[parent] = c[child];parent = child;child = parent * 2 + 1;}c[parent] = tmp;//入坑}void _AdjustUp(int child) {int tmp = c[child];int parent = (child-1) / 2;while (child>0) {if (comp(tmp,c[parent]))//不符合交换条件break;c[child] = c[parent];child = parent;parent = (child - 1) / 2;}c[child] = tmp;//入坑}private:Container c;Compare comp;};
};

模拟stack/queue/priority_queue相关推荐

  1. [C++](13)stack queue priority_queue 模拟实现:容器适配器,deque介绍,仿函数详解

    文章目录 使用 stack 栈 queue 队列 priority_queue 优先级队列 什么是容器适配器? deque 容器简单介绍 模拟实现 stack queue priority_queue ...

  2. C++ Stack Queue priority_queue

    栈stack:stack 后入先出(LIFO) q.top() 获取栈顶元素(并不删除) q.pop() 删除栈顶元素 q.push(x) 向栈中加入元素 q.empty() 判断栈是否为空 队列qu ...

  3. stl的set,multiset, map, multimap, deque, list, stack, queue, priority_queue

    set实际上是平衡二叉树,需要声明头文件#include<set> Insert:将元素插入集合中 使用前向迭代器对集合中序遍历 使用反向迭代器reverse_iterator可以反向遍历 ...

  4. 【C++ 语言】容器 ( queue 队列 | stack 栈 | priority_queue 优先级队列 | set 集合 | 容器遍历 | map )

    文章目录 queue 队列 stack 栈 priority_queue 优先级队列 priority_queue 优先级队列指定排序方法 priority_queue 优先级队列排序行为 prior ...

  5. bash shell数组模拟队列queue和shell数组使用技巧

    一 shell数组操作模拟队列queue或者栈stack http://www.tech-recipes.com/rx/911/queue-and-stack-using-array/ here is ...

  6. Stack/Queue与Vector/List的联系

    Vector:(顺序表[数组存储]) 1.当申请的空间不足的时候,需要再次开辟一块更大的空间,并把值拷过去. 2.对于尾删和尾插是比较方便的,只需要改动最后一个元素即可.不会改动原有的空间.适用于多次 ...

  7. programming review (c++): (1)vector, linked list, stack, queue, map, string, bit manipulation

    编程题常用知识点的review. most important: 想好(1)详尽步骤(2)边界特例,再开始写代码. I.vector #include <iostream> //0.头文件 ...

  8. C++ STACK Queue

    STL--stack/queue的使用方法 2010-01-05 17:36 stack(栈)和queue(队列)也是在程序设计中经常会用到的数据容器,STL为我们提供了方便的stack(栈)的que ...

  9. STL之stack,queue,优先队列

     1.stack,size(),empty(),pop()函数 #include<stack> #include <iostream> using namespace st ...

最新文章

  1. 交换机的基本概念和配置
  2. 改变libreOffice的Calc的背景颜色
  3. 32个最热CPLD-FPGA论坛
  4. JavaSE基础知识(6)—异常和异常处理
  5. java ee 员工管理系统,fb3492 javaEE_原生Servlet_MySql企业员工信息管理系统的设计与实现,java源码含论文与答辩PPT...
  6. mysql show_db 权限_菜鸟课堂:MySQL权限的详细解答
  7. Autorun 文件结构
  8. HCIE-Security Day10:6个实验理解VRRP与可靠性
  9. string成员函数
  10. ubuntu16.04使用腾达U6网卡驱动+建立无线热点(手机可链接)
  11. 数据结构与算法学习笔记——数据结构(四):单向环形链表(约瑟夫问题)
  12. 土地数据合集-土地出让数据2020版Globe30土地覆盖数据
  13. DSP Bootloader说明
  14. SpringBoot整合IoTDB
  15. 1096:数字统计(C C++)
  16. 信号的时域相位、频域相位
  17. 三维动画项目实训① ------(3.17-3.24)
  18. IE浏览器中img标签不显示图片
  19. ESP32双核CPU,利用核0实现蓝牙打印机打印,核1完成常规控制
  20. Kali Win-KeX SL

热门文章

  1. 游戏服务器中pvp、pve、rppvp、ffa-pvp的含义
  2. JavaScript递归函数求阶乘
  3. 关于身份认证和鉴权过程
  4. .Net Core 文件的上传下载
  5. 35、python并发编程之多线程(理论篇)
  6. 如何计算词语的相似性(附github)
  7. 烽火通信科技股份有限公司
  8. Revit二次开发,新手接入IExternalCommand、IExternalApplication,如何使用它们!
  9. Qt中model/view设计模式
  10. R语言学习系列教程及高级绘图工具使用