第33篇 STL之stack与queue:BFS/DFS的标配数据结构,面试手写不过分吧
上篇聊了map和unordered_map今天看两个受限容器——stack和queue。说它们受限是因为它们不支持遍历不能随机访问只能在特定的位置操作元素。但正是这种限制让它们在特定场景下非常高效。面试里考stack和queue通常和算法题绑在一起。用BFS求最短路径实现一个栈的排序用两个栈实现队列……这些题你都得熟悉stack和queue的接口。stack后进先出stack的接口非常简单std::stackint s; s.push(1); // 入栈 s.push(2); s.push(3); cout s.top(); // 3查看栈顶 s.pop(); // 弹出3 cout s.top(); // 2 cout s.size(); // 2push和pop都在栈顶操作后进先出LIFO。没有begin()、end()不能遍历。stack的默认底层容器是deque但你可以指定用vector或liststd::stackint, std::vectorint s; // 用vector做底层 std::stackint, std::listint s; // 用list做底层大部分时候用默认的deque就够了。如果你确定stack里的元素数量会很多且不需要在中间操作用vector底层可能缓存更友好。stack在算法面试中的应用stack在面试算法题里出现频率极高。最经典的用stack实现DFS深度优先搜索。在机器人开发里DFS常用于地图探索、迷宫求解。// 网格地图的DFS探索 void dfs(vectorvectorint grid, int r, int c) { int rows grid.size(), cols grid[0].size(); stackpairint,int s; s.push({r, c}); while (!s.empty()) { auto [cr, cc] s.top(); s.pop(); if (cr 0 || cr rows || cc 0 || cc cols) continue; if (grid[cr][cc] 1) continue; // 已访问或障碍物 grid[cr][cc] 1; // 标记已访问 // 四个方向入栈 s.push({cr-1, cc}); s.push({cr1, cc}); s.push({cr, cc-1}); s.push({cr, cc1}); } }还有个经典面试题有效的括号匹配。用stack来做遇到左括号入栈遇到右括号检查栈顶是否匹配。bool isValid(const string s) { stackchar st; for (char c : s) { if (c ( || c [ || c {) { st.push(c); } else { if (st.empty()) return false; if (c ) st.top() ! () return false; if (c ] st.top() ! [) return false; if (c } st.top() ! {) return false; st.pop(); } } return st.empty(); }queue先进先出queue的接口也很简单std::queueint q; q.push(1); // 入队尾部 q.push(2); q.push(3); cout q.front(); // 1查看队首 cout q.back(); // 3查看队尾 q.pop(); // 弹出1队首push在队尾pop在队首先进先出FIFO。同样不能遍历。queue的默认底层容器也是deque。queue在算法面试中的应用queue最经典的用途就是BFS广度优先搜索。在机器人开发里BFS用于求最短路径、 flood fill、层级遍历。// 网格地图的BFS求最短路径 int shortestPath(vectorvectorint grid, pairint,int start, pairint,int end) { int rows grid.size(), cols grid[0].size(); queuepairint,int q; q.push(start); grid[start.first][start.second] 1; // 标记已访问 int steps 0; while (!q.empty()) { int size q.size(); for (int i 0; i size; i) { auto [r, c] q.front(); q.pop(); if (r end.first c end.second) return steps; int dr[] {-1, 1, 0, 0}; int dc[] {0, 0, -1, 1}; for (int d 0; d 4; d) { int nr r dr[d], nc c dc[d]; if (nr 0 nr rows nc 0 nc cols grid[nr][nc] 0) { grid[nr][nc] 1; q.push({nr, nc}); } } } steps; } return -1; // 不可达 }BFS保证找到的是最短路径在无权图中因为它是按层级扩展的。DFS不保证最短但内存占用通常更小。priority_queue带优先级的队列面试里还有个常客priority_queue优先队列。它不是FIFO而是每次弹出的都是当前最大或最小的元素。// 默认大顶堆 priority_queueint max_heap; max_heap.push(3); max_heap.push(1); max_heap.push(5); cout max_heap.top(); // 5 // 小顶堆 priority_queueint, vectorint, greaterint min_heap; min_heap.push(3); min_heap.push(1); min_heap.push(5); cout min_heap.top(); // 1priority_queue底层是vector实现的堆结构插入和弹出都是O(log N)。在机器人开发里priority_queue是A*和Dijkstra算法的核心数据结构。每次从open list里取代价最小的节点用priority_queue天然合适。// Dijkstra算法核心 priority_queuepairdouble, int, vectorpairdouble, int, greater pq; pq.push({0.0, start_node}); while (!pq.empty()) { auto [cost, node] pq.top(); pq.pop(); // 处理node... }补充一个面试容易忽略的知识点stack和queue在STL里其实是容器适配器不是独立的容器。它们底层默认分别用deque实现但你可以通过模板参数指定其他底层容器。比如stackint, vectorint用vector做底层queueint, listint用list做底层。面试时如果你能说出stack和queue是适配器而不是容器面试官会觉得你对STL的架构理解得很透彻。在机器人开发里有时候你需要一个线程安全的队列做法就是继承std::queue然后加锁或者用std::deque配合std::mutex封装一个生产者消费者队列这在多传感器数据融合的场景里非常常见。给正在准备面试的你一点建议stack和queue本身接口简单面试主要考你怎么用它们解决问题。必须掌握的stack的LIFO特性用于DFS和括号匹配queue的FIFO特性用于BFSpriority_queue用于Dijkstra和A*。面试手写代码的时候BFS和DFS是必须闭着眼写出来的。特别是BFS的层级遍历模板每次处理一层的所有节点很多候选人写着写着就乱了。下篇讲迭代器模式——STL的灵魂设计思想。如果这篇文章对你有帮助欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。「机器人软件开发面试·从入门到精通」连载系列上一篇第32篇 STL之map与unordered_map——底层红黑树vs哈希表下一篇预告第34篇 迭代器模式——STL的灵魂设计思想有任何问题欢迎评论区留言我会尽量回复。

相关新闻

云服务器安全加固:从SSH端口更换到OpenClaw部署的完整指南

云服务器安全加固:从SSH端口更换到OpenClaw部署的完整指南

1. 为什么“养龙虾”的第一步是换掉SSH的22端口?最近在折腾OpenClaw这类AI工具链的云服务器部署,发现一个挺有意思的现象:很多新手朋友拿到云服务器后,第一件事就是兴奋地跑各种安装脚本,从Docker到Ollama,…

2026/8/16 21:40:06 阅读更多 →
银河麒麟V10桌面系统从安装到优化:新手避坑与实战配置指南

银河麒麟V10桌面系统从安装到优化:新手避坑与实战配置指南

1. 从“能用”到“好用”:银河麒麟V10桌面初体验 如果你最近因为工作或学习的原因,第一次接触银河麒麟桌面操作系统V10,你的第一反应可能是:“这界面看着挺像Windows的,但软件怎么装?输入法怎么调&#xff…

2026/8/16 21:39:06 阅读更多 →
第25篇 友元与运算符重载:面试官问我为什么给friend开了后门,我差点没解释清楚

第25篇 友元与运算符重载:面试官问我为什么给friend开了后门,我差点没解释清楚

上篇把虚函数表扒了个底朝天,今天聊一个"争议很大"的话题——友元。说实话,友元这个特性,C社区内部意见都不统一。有人觉得它是必要的工具,有人说它是破坏封装的罪人。面试的时候,如果你能讲清楚友元的适用场…

2026/8/16 21:39:06 阅读更多 →

最新新闻

《创业之路》-919-洋布即芯片:万变世代里不变的人间底层规律

《创业之路》-919-洋布即芯片:万变世代里不变的人间底层规律

近代史的入口,是一匹洋布。当代世界的棋局,是一枚芯片。跨越两百年,时代彻底换了人间:器物不同、产业不同、技术不同、场景不同。但剥开所有表层的迭代与翻新,世人追逐的东西、商业运转的规则、社会运行的骨架、人性深…

2026/8/17 3:15:09 阅读更多 →
基于QLabel的工业级指示灯系统实现与优化

基于QLabel的工业级指示灯系统实现与优化

1. 项目概述:用QLabel打造一个工业级的指示灯系统在工业上位机、设备监控或者任何需要直观状态反馈的桌面软件里,指示灯(Status LED)是个再常见不过的组件了。无论是PLC通讯状态、设备运行模式,还是烘箱的烘烤阶段&…

2026/8/17 3:15:09 阅读更多 →
楼宇微网虚拟储能系统建模与优化调度实践

楼宇微网虚拟储能系统建模与优化调度实践

1. 项目背景与核心价值楼宇微网作为分布式能源系统的重要载体,正面临供需匹配精度不足的痛点。传统方案依赖物理储能设备,但电池成本高、寿命有限的问题始终存在。我们团队在商业综合体能源管理项目中,发现空调系统、电梯等负荷的柔性可调特性…

2026/8/17 3:15:09 阅读更多 →
Android应用集成腾讯TBS X5内核:解决WebView兼容性问题与性能优化实战

Android应用集成腾讯TBS X5内核:解决WebView兼容性问题与性能优化实战

1. 项目概述:为什么我们需要X5内核?在Android应用开发里,WebView是个绕不开的组件,无论是内嵌活动页面、展示富文本内容,还是实现混合开发,都离不开它。但如果你用过Android系统自带的WebView,大…

2026/8/17 3:15:09 阅读更多 →
多Agent系统协作中Agent幻觉与过早终止的实战解决方案

多Agent系统协作中Agent幻觉与过早终止的实战解决方案

1. 从“完成了”到“可交付”:Agent协作中的认知鸿沟最近在搞一个多Agent协作的项目,团队里几个AI智能体干得热火朝天,最后某个核心Agent在日志里自信满满地打出一句“任务已完成”。我们几个开发一看,以为大功告成,准…

2026/8/17 3:15:09 阅读更多 →
网页表单自动填写技术:从DOM操作到自动化测试的四种方法详解

网页表单自动填写技术:从DOM操作到自动化测试的四种方法详解

1. 项目概述:为什么我们需要自动填写表单?做前端开发或者测试的朋友,肯定都遇到过这样的场景:一个注册页面有十几个输入项,每次测试都要手动敲一遍;或者一个后台管理系统,每天要重复录入大量格式…

2026/8/17 3:14:06 阅读更多 →

日新闻

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必修课? 如果你用LabVIEW做过稍微复杂点的项目,尤其是涉及界面响应、多任务并行或者硬件IO等待的场景,大概率遇到过这样的窘境:前面板点个按钮,整个程序就“卡死…

2026/8/17 0:00:08 阅读更多 →
LabVIEW异步调用实战:解决界面卡顿与并行处理难题

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

1. 项目概述:为什么异步调用是LabVIEW进阶的必经之路如果你在LabVIEW里写过稍微复杂点的程序,尤其是涉及到界面响应、多任务并行或者硬件IO等待,大概率会遇到一个头疼的问题:程序“卡”住了。前面板点不动,进度条不更新…

2026/8/17 0:00:08 阅读更多 →
飞书局域网文件传输实战:3种方案实现高速点对点传输

飞书局域网文件传输实战:3种方案实现高速点对点传输

1. 项目概述:为什么要在局域网内用飞书传文件? 飞书作为一款主流的协同办公套件,其核心功能是围绕云端协作设计的。无论是文档、表格还是文件,通常的分享逻辑都是“上传到云端 -> 生成链接 -> 分享给同事”。这个流程在互联…

2026/8/17 0:00:08 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/17 2:58:27 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/17 2:58:30 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/17 2:58:32 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/16 6:00:23 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/16 6:00:24 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/16 6:00:27 阅读更多 →