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

《C++ Stack 与 Queue 完全使用指南:基础操作 + 经典场景 + 实战习题》

一. 先搞懂基础:Stack 与 Queue 的核心特性

在写代码前,首先要明确两者的 “数据访问规则”—— 这是它们区别于其他容器的关键:

容器

核心规则

访问特性

适用场景

stack

后进先出(LIFO)

仅能访问“栈顶”元素

函数调用栈、表达式求值、撤销操作

queue

先进先出(FIFO)

仅能访问“队头”和“队尾”元素

任务调度、消息队列、广度优先搜索(BFS)

两者的共性是 “限制访问”:不支持随机访问(如[]下标),也不支持迭代器遍历 —— 目的是强制遵循其数据规则,避免错误的访问方式


二. Stack(栈):后进先出(LIFO)的容器

2.1 核心特性:
  • 访问规则:只能从"栈顶"添加或删除元素(最后入栈的元素最先出栈)
  • 适用场景:函数调用栈,表达式求值等。

在这里插入图片描述

参考文档:stack - C++ Reference

2.2 头文件与定义

代码语言:javascript

AI代码解释

#include <stack> // 必须包含头文件 using namespace std; // 定义栈:默认存储int类型,底层依赖deque实现 stack<int> st; // 可指定底层容器(如vector、list) stack<int, vector<int>> st_v; // 基于vector的栈 stack<int, list<int>> st_l; // 基于list的栈
2.3 常用接口全解析

接口

功能描述

示例

push(val)

向栈顶添加元素,新元素成为新的栈顶

st.push(10);

pop()

删除当前栈顶元素(操作后原栈顶的下一个元素成为新栈顶),无返回值,需先确保栈非空

st.pop();

top()

返回栈顶元素的引用(可直接读取或修改栈顶值),需先确保栈非空

int x = st.top();(读取);st.top() = 20;(修改)

size()

返回栈中当前存储的元素总个数,返回值为无符号整数(size_t)

cout << st.size();

empty()

判断栈是否为空,若栈中无元素则返回 true,否则返回 false

if (st.empty()) { ... }

2.4 基础用法演示

代码语言:javascript

AI代码解释

void test_stack() { stack<int> st; st.push(1); st.push(2); st.push(3); st.emplace(4); while (!st.empty()) { cout << st.top() << " "; st.pop(); } cout << endl; } int main() { test_stack(); }

在这里插入图片描述


三. Queue(队列):先进先出(FIFO)的容器

3.1 核心特性:
  • 访问规则:从"队尾"添加元素,从"队头"删除元素(最先入队的元素最先出队)
  • 适用场景:任务调度(如打印队列)、消息队列、广度优先搜索(BFS)等

在这里插入图片描述

参考文档:queue - C++ Reference

3.2 头文件与定义:

代码语言:javascript

AI代码解释

#include <queue> // 必须包含的头文件 using namespace std; // 定义队列:默认底层依赖deque实现 queue<int> q; // 可指定底层容器(如list,不建议用vector,因vector头删效率低) queue<int, list<int>> q_l; // 基于list的队列
3.3 常用接口全解析

接口

功能描述

示例

push(val)

向队列的队尾添加一个元素,新元素成为队列的最后一个元素,操作后队列长度+1

q.push("任务1");

pop()

删除队列的队头元素(即最早入队的元素),操作后队列长度-1,无返回值(需先通过 front() 获取队头元素再删除)

q.pop();

front()

返回队列队头元素的引用(可读取或修改),仅访问不删除,需确保队列非空

string task = q.front();(读取);q.front() = "优先任务1";(修改)

back()

返回队列队尾元素的引用(可读取或修改),仅访问不删除,需确保队列非空

string last = q.back();(读取);q.back() = "最后任务";(修改)

size()

返回队列中当前存储的元素总个数,返回值类型为 size_t(无符号整数)

cout << q.size();

empty()

判断队列是否为空:若队列中无元素则返回 true,有元素则返回 false,常用于遍历或删除前判断队列状态

if (q.empty()) { cout << "队列为空"; }

3.4 基础用法演示

代码语言:javascript

AI代码解释

void test_queue() { queue<int> q; q.push(1); q.push(2); q.push(3); q.emplace(4); while (!q.empty()) { cout << q.front() << " "; q.pop(); } cout << endl; } int main() { //test_stack(); test_queue(); }

在这里插入图片描述


四. 实战练习题

4.1 最小栈

题目链接

155. 最小栈 - 力扣(LeetCode)

题目描述

在这里插入图片描述

题目示例

在这里插入图片描述

C++算法代码

代码语言:javascript

AI代码解释

class MinStack { public: MinStack() { //可以啥都不写,甚至可以删掉 //会去调这个自定义类型的默认构造 } void push(int val) { _st.push(val); if(_minst.empty()||_minst.top()>=val) _minst.push(val); } void pop() { if(_minst.top()==_st.top()) _minst.pop(); _st.pop(); } int top() { return _st.top(); } int getMin() { return _minst.top(); } private: stack<int> _st; stack<int> _minst; }; /** * Your MinStack object will be instantiated and called as such: * MinStack* obj = new MinStack(); * obj->push(val); * obj->pop(); * int param_3 = obj->top(); * int param_4 = obj->getMin(); */

图解

在这里插入图片描述

4.2 栈的压入、弹出序列

题目链接

栈的压入、弹出序列_牛客题霸_牛客网

题目描述

在这里插入图片描述

题目示例

在这里插入图片描述

C++算法代码

代码语言:javascript

AI代码解释

class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pushV int整型vector * @param popV int整型vector * @return bool布尔型 */ bool IsPopOrder(vector<int>& pushV, vector<int>& popV) { int pushi=0,popi=0; stack<int> st; while(pushi<pushV.size()) { st.push(pushV[pushi]); while(!st.empty()&&st.top()==popV[popi]) { st.pop(); popi++; } pushi++; } return st.empty(); } };

图解

在这里插入图片描述



http://www.jsqmd.com/news/450584/

相关文章:

  • 【Chromepass】:颠覆式Chrome密码解密解决方案 - 让本地密码管理更高效
  • 模型评估必看!泰勒图三大核心指标(R/RMSE/std)的避坑指南
  • 为什么你的Dev-C++控制台总是中文乱码?ANSI编码的隐藏陷阱与实战修复
  • 开源工具Ryujinx:打造跨平台Switch游戏体验的完整解决方案
  • 利用快马平台快速生成db9接口引脚定义查询与模拟测试工具原型
  • Graylog日志分析平台:运维工程师实时监控与异常检测指南
  • 对抗屏幕蓝光:打造健康数字阅读环境的完整方案
  • 3大核心功能助力文字冒险游戏开发:JavaQuestPlayer零基础入门指南
  • RabbitMQ vs Kafka背压机制对比:消息队列的‘刹车系统‘设计哲学
  • 为什么Win7共享打印机必须开防火墙?深入解析0x000006d9错误背后的机制
  • PotplayerPanVideo:突破云端视频播放瓶颈的协议转换引擎
  • GHelper:华硕笔记本轻量级硬件控制工具的全面优化指南
  • Jetpack Compose BOM 2026.02.01 解读与升级指南
  • Flutter 三方库 loxia 的鸿蒙化适配指南 - 掌控数据资产、精密 UI 模型治理实战、鸿蒙级桌面专家
  • 零基础DIY智能家居离线AI语音助手:从硬件到交互的完整指南
  • 抖音智能提取效率工具:从手动复制到批量分析的技术革命
  • 零基础也能开发专业文字冒险游戏:JavaQuestPlayer全攻略
  • 提升开发效率:用快马AI自动生成ESP32物联网设备连接与通信代码
  • 3步智能革新:OpCore Simplify让非苹果硬件高效运行macOS
  • JupyterNotebook内核连接失败的3种常见原因及解决方案(附报错排查指南)
  • AR 眼镜上的出行助手:从零构建基于 Rokid CXR-M SDK 的行程管理应用
  • STM32F407ZGT6 USART1 DMA接收配置避坑指南:从NORMAL到CIRCLAR的实战经验
  • IGBT驱动芯片2ED020I12F2避坑指南:去饱和电路常见的5个设计误区及解决方案
  • Herbie气象数据工具:专业气象数据获取与处理的技术指南
  • 基于Coze API的智能客服本地化部署实战:效率提升与避坑指南
  • 护眼工具与视觉健康:Dark Reader的全方位屏幕保护方案
  • 零基础玩转机器人:快马AI带你编写第一个clawbot程序
  • J-LINK和ST-LINK切换的那些坑:当Keil项目残留配置导致No Cortex-M Device错误时
  • 顶点动画纹理技术指南:从原理到跨平台实践
  • 新手入门安卓开发:基于快马生成24点棋牌游戏学事件处理