C++ stack和queue容器使用_C++栈与队列数据结构实战

发布时间 - 2026-01-07 00:00:00    点击率:
C++中stack和queue是STL提供的容器适配器,分别用于实现后进先出(LIFO)和先进先出(FIFO)操作。stack支持push、pop、top等操作,常用于括号匹配等场景;queue提供front、back、push、pop等功能,适用于层序遍历(BFS)等应用。两者均需包含对应头文件并注意访问前判空,避免运行时错误。

在C++中,stack(栈)和queue(队列)是两种常用的数据结构,它们被包含在标准模板库(STL)中,分别定义于#include #include 头文件。虽然底层可以用vector、deque或list实现,但它们提供了一种更安全、更语义化的接口来处理“后进先出”和“先进先出”的逻辑。

stack 栈的基本使用

栈是一种后进先出(LIFO, Last In First Out)的数据结构。C++中的std::stack是一个容器适配器,它不支持遍历,只允许从一端(栈顶)进行操作。

常用操作包括:

  • push(element):将元素压入栈顶
  • pop():移除栈顶元素(不返回值)
  • top():获取栈顶元素的引用
  • empty():判断栈是否为空
  • size():返回栈中元素个数

示例代码:

#include 
#include int main() { std::stack s; s.push(10); s.push(20); s.push(30);
while (!s.empty()) {
    std::cout zuojiankuohaophpcnzuojiankuohaophpcn s.top() zuojiankuohaophpcnzuojiankuohaophpcn " ";
    s.pop();
}
// 输出:30 20 10
return 0;

}

queue 队列的基本使用

队列遵循先进先出(FIFO, First In First Out)原则。C++中的std::queue也是容器适配器,默认基于deque实现。

主要操作有:

  • push(element):在队尾添加元素
  • pop():删除队首元素(不返回值)
  • front():访问队首元素
  • back():访问队尾元素
  • empty()size():与stack一致

示例代码:

#include 
#include int main() { std::queue q; q.push(10); q.push(20); q.push(30);
while (!q.empty()) {
    std::cout zuojiankuohaophpcnzuojiankuohaophpcn q.front() zuojiankuohaophpcnzuojiankuohaophpcn " ";
    q.pop();
}
// 输出:10 20 30
return 0;

}

实战应用场景举例

stack和queue在算法题和系统设计中非常实用。

使用 stack 判断括号匹配

遍历字符串,遇到左括号入栈,右括号时检查栈顶是否匹配并弹出。

bool isValid(std::string s) {
    std::stack st;
    for (char c : s) {
        if (c == '(' || c == '[' || c == '{') {
            st.push(c);
        } else {
            if (st.empty()) return false;
            if ((c == ')' && st.top() != '(') ||
                (c == ']' && st.top() != '[') ||
                (c == '}' && st.top() != '{')) {
                return false;
            }
            st.pop();
        }
    }
    return st.empty();
}

使用 queue 实现层序遍历(BFS)

二叉树的广度优先搜索依赖队列保存待访问节点。

struct TreeNode {
    int val;
    TreeNode *left, *right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

void bfs(TreeNode root) { if (!root) return; std::queue> q; q.push(root);

while (!q.empty()) {
    TreeNode* node = q.front(); q.pop();
    std::cout zuojiankuohaophpcnzuojiankuohaophpcn node-youjiankuohaophpcnval zuojiankuohaophpcnzuojiankuohaophpcn " ";

    if (node-youjiankuohaophpcnleft)  q.push(node-youjiankuohaophpcnleft);
    if (node-youjiankuohaophpcnright) q.push(node-youjiankuohaophpcnright);
}

}

基本上就这些。掌握stack和queue的接口和典型用法,能显著提升编码效率,特别是在处理递归模拟、状态暂存、广度搜索等场景时。注意不要误用top()front()前未判空,否则会引发运行时错误。


# node  # 编码  #   # ai  # c++  # ios  # stream  # include  # 字符串  # 递归  # 数据结构  # 接口  # 算法  # 遍历  # 返回值  # 是一个  # 头文件  # 是在  # 是一种  # 两种  # 可以用 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 无锡营销型网站制作公司,无锡网选车牌流程?  如何快速使用云服务器搭建个人网站?  如何在Windows环境下新建FTP站点并设置权限?  Laravel观察者模式如何使用_Laravel Model Observer配置  Laravel如何使用Livewire构建动态组件?(入门代码)  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Laravel storage目录权限问题_Laravel文件写入权限设置  高防服务器租用首荐平台,企业级优惠套餐快速部署  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  如何在橙子建站上传落地页?操作指南详解  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  独立制作一个网站多少钱,建立网站需要花多少钱?  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  详解Oracle修改字段类型方法总结  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  Python正则表达式进阶教程_复杂匹配与分组替换解析  在线制作视频的网站有哪些,电脑如何制作视频短片?  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  iOS验证手机号的正则表达式  如何用y主机助手快速搭建网站?  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel如何实现用户密码重置功能?(完整流程代码)  JavaScript如何实现音频处理_Web Audio API如何工作?  Swift中循环语句中的转移语句 break 和 continue  如何挑选高效建站主机与优质域名?  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  原生JS实现图片轮播切换效果  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  潮流网站制作头像软件下载,适合母子的网名有哪些?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  网站制作壁纸教程视频,电脑壁纸网站?  PythonWeb开发入门教程_Flask快速构建Web应用  Laravel如何使用Telescope进行调试?(安装和使用教程)  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  JavaScript如何实现错误处理_try...catch如何捕获异常?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  如何快速搭建高效WAP手机网站吸引移动用户?  python中快速进行多个字符替换的方法小结  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  Android自定义控件实现温度旋转按钮效果  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  phpredis提高消息队列的实时性方法(推荐)