当前位置: 首页 > news >正文

【stack、queue、deque、priority_queue】C++ 栈 / 队列 / 优先级队列全解析!手撕实现 + 二叉树层序遍历(附源码)

栈和队列没有迭代器,他们只是容器适配器,不是容器。容器才有迭代器

文章目录

  • 栈Stack
    • 头文件:stack
    • 本质
    • 成员函数
    • 实现
      • stack.h
    • 按需实例化:
  • 队列queue
    • 本质
    • 成员函数
    • 实现
      • queue.h
  • deque双端队列
    • 成员函数
  • priority_queue优先级队列
    • 本质
    • 头文件:queue‼️
    • 成员函数
    • 应用
      • 大根堆
      • 小根堆
  • 二叉树的层序遍历
    • 1.实现层序遍历:
    • 2.进一步实现题目要求

栈Stack

➡️有关 栈的实现/二叉树的实现 的知识,可以点击这里进行学习⬅️






头文件:stack






本质

template<classT,classContainer=deque<T>>classstack;
  • 后进先出
  • 栈是一种“容器适配器” ——>栈可能是由list,vector或deque容器(称为底层容器)变化而来
  • 底层容器,如果不传,默认是deque





成员函数

    • (constructor)

      Construct stack (public member function )

    • empty

      Test whether container is empty (public member function )

    • size

      Return size (public member function )

    • top

      Access next element (public member function )

    • push

      Insert element (public member function )

    • emplace

      Construct and insert element (public member function )

    • pop

      Remove top element (public member function )

    • swap

      Swap contents (public member function )






实现

stack.h

#pragmaoncenamespacelcj{template<classT,classContainer=vector<T>>classstack{public:/// <summary>/// 不用写构造函数,因为container是自定义类型,会调用对应的构造函数/// </summary>///voidpush(constT&x){_con.push_back(x);}voidpop(){_con.pop_back();}constT&top()const{return_con.back();///不能通过‘[ ]’访问,当container是list时,没有这个功能}size_tsize()const{return_con.size();}boolempty()const{return_con.size()==0;}private:Container _con;};}





按需实例化:

在.h中写的类中的成员函数,并不会全都被实例化,编译器只实例化使用的接口——>编译器不检查细节语法,有时候不会报错,但是使用的时候还是会发生错误——>写函数的时候还是要写一个检查一个











队列queue

本质

template<classT,classContainer=deque<T>>classqueue;
  • 先进先出
  • 也是一种“容器适配器” ——>栈可能是由list或deque容器(称为底层容器)变化而来
  • 底层容器,如果不传,默认是deque





成员函数

    • (constructor)

      Construct queue (public member function )

    • empty

      Test whether container is empty (public member function )

    • size

      Return size (public member function )

    • front

      Access next element (public member function )

    • back

      Access last element (public member function )

    • push

      Insert element (public member function )

    • emplace

      Construct and insert element (public member function )

    • pop

      Remove next element (public member function )

    • swap

      Swap contents (public member function )






实现

queue.h

#pragmaoncenamespacelcj{template<classT,classContainer=list<T>>classqueue{public:/// <summary>/// 不用写构造函数,因为container是自定义类型,会调用对应的构造函数/// </summary>///voidpush(constT&x){_con.push_back(x);}voidpop(){_con.pop_front();}constT&back()const{return_con.back();///不能通过‘[ ]’访问,当container是list时,没有这个功能}constT&front()const{return_con.front();///不能通过‘[ ]’访问,当container是list时,没有这个功能}size_tsize()const{return_con.size();}boolempty()const{return_con.size()==0;}private:Container _con;};}










deque双端队列

stack和queue的缝合

成员函数

函数分类函数名功能说明
构造 / 析构 / 赋值(constructor)构造 deque 容器(公有成员函数)
(destructor)销毁 deque 容器(公有成员函数)
operator=给 deque 容器赋值(公有成员函数)
迭代器(Iterators)begin返回指向容器起始位置的迭代器(公有成员函数)
end返回指向容器末尾位置的迭代器(公有成员函数)
rbegin返回指向容器反向起始位置的反向迭代器(公有成员函数)
rend返回指向容器反向末尾位置的反向迭代器(公有成员函数)
cbegin返回指向容器起始位置的 const 迭代器(公有成员函数)
cend返回指向容器末尾位置的 const 迭代器(公有成员函数)
crbegin返回指向容器反向起始位置的 const 反向迭代器(公有成员函数)
crend返回指向容器反向末尾位置的 const 反向迭代器(公有成员函数)
容量管理(Capacity)size返回容器当前存储的元素数量(公有成员函数)
max_size返回容器可容纳的最大元素数量(公有成员函数)
resize改变容器的大小(公有成员函数)
empty检测容器是否为空(公有成员函数)
shrink_to_fit释放容器未使用的内存,收缩到适配当前元素大小(公有成员函数)
元素访问(Element access)operator[]访问容器中指定下标位置的元素(公有成员函数)
at访问容器中指定下标位置的元素,带越界检查(公有成员函数)
front访问容器的第一个元素(公有成员函数)
back访问容器的最后一个元素(公有成员函数)
内容修改(Modifiers)assign给容器重新赋值,覆盖原有内容(公有成员函数)
push_back在容器末尾添加一个元素(公有成员函数)
push_front在容器开头插入一个元素(公有成员函数)
pop_back删除容器末尾的最后一个元素(公有成员函数)
pop_front删除容器开头的第一个元素(公有成员函数)
insert在容器指定位置插入元素(公有成员函数)
erase删除容器指定位置的元素(公有成员函数)
swap交换两个 deque 容器的内容(公有成员函数)
clear清空容器内的所有元素(公有成员函数)
emplace_front在容器开头直接构造并插入一个元素(公有成员函数)
emplace_back在容器末尾直接构造并插入一个元素(公有成员函数)
分配器(Allocator)get_allocator获取容器使用的内存分配器(公有成员函数)
非成员函数重载relational operatorsdeque 容器的关系比较运算符(函数模板)
swap交换两个 deque 容器的内容(函数模板)










priority_queue优先级队列

➡️有关 堆和二叉树 的知识,可以点击这里进行学习【数据结构精讲】堆与二叉树从底层原理到代码落地:堆的构建 / 调整 / 排序 + 二叉树遍历 / 操作(附完整 C++ 源码 + LeetCode 题解)⬅️

本质

template<classT,classContainer=vector<T>,classCompare=less<typenameContainer::value_type>>classpriority_queue;
  • 就是个默认是大根堆
  • 也是容器适配器,默认是vector(因为下标访问用的多)





头文件:queue‼️

不是单独的‼️






成员函数

    • (constructor)

      Construct priority queue (public member function )

    • empty

      Test whether container is empty (public member function )

    • size

      Return size (public member function )

    • top

      Access top element (public member function )

    • push

      Insert element (public member function )

    • emplace

      Construct and insert element (public member function )

    • pop

      Remove top element (public member function )

    • swap

      Swap contents (public member function )






应用

大根堆

  • priority_queue<int, vector<int>, less<int>> pq;中的:less<int>也可以不写,是默认的,这时候是大根堆——>打印出来是从大到小的
#include<queue>usingnamespacestd;///必须在#include"stack.h"的前面,这样,如果stack.h里面有std::cout这种函数也没问题intmain(){priority_queue<int,vector<int>,less<int>>pq;pq.push(3);pq.push(777);pq.push(66);pq.push(88);pq.push(22);pq.push(9);while(!pq.empty()){cout<<pq.top()<<endl;pq.pop();}return0;}



小根堆

——>从小到大打印

只需要改less<int>greater<int>即可











栈的压入、弹出序列

  1. 入栈序列,每次入栈一个值
  2. 如果入后的栈顶数据跟出栈序列匹配,——>出栈——>不断匹配,不断出栈
  3. 入栈序列入完了,就结束了





二叉树的层序遍历

原题链接:二叉树的层序遍历

这个题目给的是二叉树,要求是输出一个vector<vector<int>>类型的数组

1.实现层序遍历:

队列存节点指针,下来一个节点,放一个节点的子节点

  • 创造一个队列,存的是TreeNode*类型的指针:queue<TreeNode*> q;

  • 插入树根:q.push(root);

  • while循环遍历:

    • 条件: 队列中还有元素:while(!q.empty())

    • 循环体:

      • 得到队列头节点:TreeNode* thisnode=q.front();

      • 头删:q.pop();

      • 操作:……

      • 将这个节点的孩子放进队列:

        if(thisnode->left)
        q.push(thisnode->left);

        if(thisnode->right)
        q.push(thisnode->right);

queue<TreeNode*>q;intlevelsize=0;if(root){q.push(root);}while(!q.empty()){TreeNode*thisnode=q.front();q.pop();//对thisnode的操作if(thisnode->left)q.push(thisnode->left);if(thisnode->right)q.push(thisnode->right);}



2.进一步实现题目要求

在上面的条件下,我们一层一层输入数据

  1. levelsize作为内部的循环条件
    1. 在“插入树根”的时候,levelsize置为1——因为第一层只有一个节点
      1. 然后的循环中,只将levelsize个节点的子节点插入队列中
    2. 插入结束之后的队列的size,就是下一层的节点个数
classSolution{public:vector<vector<int>>levelOrder(TreeNode*root){vector<vector<int>>vv;queue<TreeNode*>q;intlevelsize=0;if(root){q.push(root);levelsize=1;}while(!q.empty()){vector<int>v;while(levelsize--)////////////////////////////////levelsize作为内部的循环条件{TreeNode*thisnode=q.front();q.pop();v.push_back(thisnode->val);//操作if(thisnode->left)q.push(thisnode->left);if(thisnode->right)q.push(thisnode->right);}vv.push_back(v);//////////////////////////////////////////操作levelsize=q.size();/////////////////////////////插入结束之后的队列的size,就是下一层的节点个数}returnvv;}};









155. 最小栈

http://www.cnnetsun.cn/news/2815560.html

相关文章:

  • KMS_VL_ALL_AIO:Windows与Office批量激活的终极技术方案
  • 保姆级教程:用FNL数据从零搭建WRF环境并成功运行第一个案例(避坑指南)
  • 告别phpMyAdmin!一个Docker容器搞定MySQL、PostgreSQL、MongoDB,Adminer保姆级安装与多数据库连接实战
  • Windows 10/11 下用 Visual Studio 2019 编译 ZLMediaKit 流媒体服务,保姆级避坑指南
  • 信号处理实战:用db4小波分析你的传感器数据(MATLAB验证+C语言移植指南)
  • AI人脸识别考勤签到系统
  • 别再手动整理BOM了!用Excel自定义Altium Designer料单模板,效率翻倍(附模板文件)
  • 【闲聊】孩子越长大为什么越不愿意和父母讲心里话(亿点不一样)
  • 第【7】期--自由空间光通信(FSO)在Gamma-Gamma湍流信道下的BER性能仿真-maltab完整代码+报告
  • 零基础落地!三个精益实操技巧,激活员工主动改善意识
  • 别再死记硬背了!一张图+Python脚本帮你彻底搞懂ISO15765-2网络层多帧传输与流控
  • STM32H743ZI驱动DP83848实现网线热插拔:从硬件中断到lwip 2.1.3链路状态管理的完整流程
  • 用CODESYS仿真一个真实的冰箱:从ST代码反推PLC控制逻辑设计
  • STM32H743ZI驱动DP83848,从硬件连线到lwip2.1.3协议栈移植的保姆级避坑指南
  • Cursor 高级指南(二):Agent、Plan、Ask、Debug 与 Tab、内联编辑
  • 10|Netty native epoll 与零拷贝:从 Java NIO 再往下看一层![
  • Cherry Studio缺失instructions导致OpenAI-Response API访问失败
  • 大千万级文档 RAG,这 11 个步骤把幻觉压到极低
  • 分布式存储架构设计与一致性算法实践
  • Qt 入门 09|Qt 常用容器:QString/QByteArray/QList/QVector 字符串与容器使用大全
  • 终极JSXBIN解码器指南:快速解密Adobe ExtendScript二进制文件
  • Spring AI 从入门到精通-ChatClient你与 AI 对话的终极武器
  • 神经渲染:重塑室内设计的“造梦引擎”——从原理到落地全解析
  • 深度解析Jsxer:JSXBIN二进制反编译引擎的架构设计与实现原理
  • 终极macOS清理指南:使用Pearcleaner彻底告别应用残留文件
  • 3步掌握OBS多平台推流:免费插件让直播效率提升300%
  • 小米智能家居接入HomeAssistant的终极解决方案:Xiaomi Miot插件深度解析
  • Notepad-- 终极使用指南:跨平台文本编辑器的完整掌握手册
  • AI编程15-重构与AI辅助代码改进:让AI帮你还技术债,代码可维护性提升200%
  • AI驱动的内容获客革命(2024最新成本模型验证)