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

C/C++栈与队列应用面试题

题目 1:用栈实现队列

题目描述

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty)。

解题思路

双栈分工:

  • inStack:负责入队操作,push 直接压入此栈
  • outStack:负责出队操作 当outStack为空时,将inStack中所有元素依次弹出并压入outStack,此时outStack的栈顶就是队首元素。

代码实现

cpp

运行

class MyQueue { private: stack<int> inStack, outStack; void in2out() { while (!inStack.empty()) { outStack.push(inStack.top()); inStack.pop(); } } public: MyQueue() {} void push(int x) { inStack.push(x); } int pop() { if (outStack.empty()) { in2out(); } int val = outStack.top(); outStack.pop(); return val; } int peek() { if (outStack.empty()) { in2out(); } return outStack.top(); } bool empty() { return inStack.empty() && outStack.empty(); } };

复杂度分析

  • 时间复杂度:每个元素最多入栈和出栈各两次,均摊时间复杂度 O (1)
  • 空间复杂度:O (n)

面试考点

考察栈与队列的特性转换。面试官常反向问:用队列实现栈怎么做?


题目 2:有效的括号

题目描述

给定一个只包括'('')''{''}''['']'的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合,左括号必须以正确的顺序闭合。

解题思路

栈匹配法: 遍历字符串,遇到左括号就将对应的右括号压入栈;遇到右括号时,检查栈是否为空或栈顶是否与当前字符匹配,不匹配则直接返回 false,匹配则弹出栈顶。最后栈为空则说明全部匹配。

代码实现

cpp

运行

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

复杂度分析

  • 时间复杂度:O (n),一次遍历
  • 空间复杂度:O (n),最坏情况全是左括号

面试考点

栈的经典应用。延伸问:如果只有一种括号怎么优化空间?怎么计算最长有效括号长度?


题目 3:最小栈

题目描述

设计一个支持pushpoptop操作,并能在常数时间内检索到最小元素的栈。

解题思路

辅助栈法: 用两个栈,主栈正常存储元素,辅助栈同步存储当前最小值。每次 push 时,辅助栈压入「当前值与辅助栈栈顶的较小值」;pop 时两个栈同步弹出。这样辅助栈的栈顶永远是当前栈内的最小值。

代码实现

cpp

运行

class MinStack { private: stack<int> mainStack; stack<int> minStack; public: MinStack() { minStack.push(INT_MAX); // 初始压入最大值,方便第一次比较 } void push(int val) { mainStack.push(val); minStack.push(min(minStack.top(), val)); } void pop() { mainStack.pop(); minStack.pop(); } int top() { return mainStack.top(); } int getMin() { return minStack.top(); } };

复杂度分析

  • 所有操作时间复杂度:O (1)
  • 空间复杂度:O (n),辅助栈占用额外空间

面试考点

考察空间换时间的设计思想。面试官常追问:不使用额外栈怎么实现?(可用差值法,用一个变量存最小值)


题目 4:滑动窗口最大值

题目描述

给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字,滑动窗口每次只向右移动一位。返回每个滑动窗口中的最大值。

解题思路

单调队列: 维护一个单调递减的双端队列,队列中存储元素的索引:

  1. 新元素入队前,弹出队尾所有比它小的元素,保证队列递减
  2. 检查队首元素是否超出窗口范围,超出则弹出队首
  3. 当窗口形成(索引 ≥ k-1)后,队首就是当前窗口的最大值

代码实现

cpp

运行

vector<int> maxSlidingWindow(vector<int>& nums, int k) { deque<int> dq; // 存储索引,保持对应值递减 vector<int> res; for (int i = 0; i < nums.size(); i++) { // 弹出队尾比当前值小的元素 while (!dq.empty() && nums[i] >= nums[dq.back()]) { dq.pop_back(); } dq.push_back(i); // 弹出超出窗口的队首 while (dq.front() <= i - k) { dq.pop_front(); } // 窗口形成后记录结果 if (i >= k - 1) { res.push_back(nums[dq.front()]); } } return res; }

复杂度分析

  • 时间复杂度:O (n),每个元素最多入队和出队一次
  • 空间复杂度:O (k),队列长度不超过窗口大小

面试考点

单调队列的经典应用,是面试拔高题。重点考察对数据结构特性的灵活运用。

谢谢
http://www.jsqmd.com/news/1116101/

相关文章:

  • PilotGo-plugins:一站式运维插件平台,10大核心功能全面解析
  • 企业 AI 应用扩到多部门前,为什么必须先做知识库权限分层
  • Metabase CVE-2021-41277漏洞原理与CTF实战利用全解析
  • SPI EEPROM与PIC18F55K42嵌入式存储方案详解
  • 悦己经济下的香薰出海:TikTok达人营销如何“转译”情绪价值
  • AI编程工具大规模落地后,代码质量管控完整实战方案
  • 基于STM32单片机水流量控制系统 智能水表 煤气 流量计检测 2(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • 探秘龙江手工床垫厂家:传统工艺与现代品质如何完美融合?
  • 3步解锁暗影精灵全部性能:开源工具OmenSuperHub终极指南
  • 【TwinCAT3运动控制】TwinCAT3 NC PTP 运动控制实战:松下伺服驱动器硬件配置与调试全流程
  • VisualCppRedist AIO:终极免费方案,一键修复所有Windows运行库问题
  • D类音频功放系统设计与STM32 DSP优化实践
  • BMI270与PIC18F65K40在嵌入式传感器开发中的黄金组合
  • MC6470 IMU与PIC18F86J55的运动控制系统开发指南
  • 6DoF运动追踪技术:从IMU到嵌入式实现的全面解析
  • lboot安装完全指南:从QEMU测试到真实硬件部署的10个步骤
  • 如何构建一个 Agent
  • DeepChem分子指纹终极指南:5种技术路线深度对比与实战性能分析
  • Burp Suite原生功能深度解析:5大实战技巧提升Web安全测试效率
  • STM32F031K6与13DOF传感器融合开发实践
  • 猫抓Cat-Catch:浏览器资源嗅探的技术决策树与架构演进启示
  • STM32数字控制DC-DC降压转换器设计与实现
  • Docker部署AI视频分析平台常见问题和排查清单
  • AI编程范式革命(从Copilot到Autonomous Agent):头部科技公司内部培训手册首次解密
  • 【爱马仕智能体】简化 Hermes 部署流程 桌面端一键安装完整实操教学(含安装包)
  • HBM Predictor部署指南:在生产环境中部署高带宽内存故障预测系统
  • BLDC电机FOC控制:A89307与STM32F7实现15A高性能驱动
  • openEuler/llm_solution编译器优化:异构融合编译器与AKG算子自动生成技术深度剖析
  • AI模型压缩与剪枝实战:从原理到工程部署
  • 如何构建企业级视频监控平台:WVP-GB28181-Pro实战指南