《C++ Stack与Queue详解掌握指南》:带领你从基础夯实到玩转栈与队列容器

《C++ Stack与Queue详解掌握指南》:带领你从基础夯实到玩转栈与队列容器

🔥个人主页:Cx330🌸

❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》

《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔

🌟心向往之行必能至


🎥Cx330🌸的简介:


目录

前言:

一. 基础夯实:Stack 与 Queue 的核心特性

二. Stack(栈):后进先出

2.1 核心特性:

2.2 头文件与定义

2.3 常用接口大全

2.4 用法演示

三. Queue(队列):先进先出

3.1 核心特性:

3.2 头文件与定义:

3.3 常用接口大全

3.4 用法演示

四. 实战练习题

4.1 最小栈

4.2 栈的压入、弹出序列

4.3 逆波兰表达式求值

4.4 二叉树的层序遍历

结尾:


前言:

stack(栈)和 queue(队列)是 C++ 标准库中两种常用的适配器容器,它们的核心价值在于提供严格的数据访问规则(栈->后进先出 ,队列->先进先出),这篇博客将着重于实际使用来帮助你快速掌握这两个容器的使用

一. 基础夯实:Stack 与 Queue 的核心特性

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

容器核心规则访问特性适用场景
stack后进先出仅能访问“栈顶”元素函数调用栈、表达式求值、撤销操作
queue先进先出仅能访问“队头”和“队尾”元素任务调度、消息队列、广度优先搜索

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


二. Stack(栈):后进先出

2.1 核心特性:

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

2.2 头文件与定义

#include <stack> //头文件 using namespace std; // 定义栈:默认存储int类型,底层依赖deque实现 stack<int> st; // 可指定底层容器 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_tcout << st.size();
empty()判断栈是否为空,若栈中无元素则返回 true,否则返回 falseif (!st.empty()) { ... }

2.4 用法演示

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(队列):先进先出

3.1 核心特性:

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

3.2 头文件与定义:

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

3.3 常用接口大全

接口功能描述示例
push(val)向队列的队尾添加一个元素,新元素成为队列的最后一个元素,操作后队列长度+1q.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 用法演示

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++代码实现

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++代码实现

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(); } }; 

4.3 逆波兰表达式求值

题目链接:

150. 逆波兰表达式求值 - 力扣(LeetCode)

题目描述:

图解:

C++代码实现

class Solution { public: int evalRPN(vector<string>& tokens) { stack<int> st; for(auto& str:tokens) { if(str=="+"||str=="-"||str=="*"||str=="/") { //运算符 int right=st.top(); st.pop(); int left=st.top(); st.pop(); switch(str[0]) { case '+': st.push(left+right); break; case '-': st.push(left-right); break; case '*': st.push(left*right); break; case '/': st.push(left/right); break; } } else{ //运算数 st.push(stoi(str)); } } return st.top(); } }; 

4.4 二叉树的层序遍历

题目链接:

102. 二叉树的层序遍历 - 力扣(LeetCode)

题目描述:

图解:

C++代码实现

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { queue<TreeNode*> q; int levelSize=0; if(root) { q.push(root); levelSize=1; } vector<vector<int>> vv; while(!q.empty()) { vector<int> v; //一层一层的出 while(levelSize--) { TreeNode* front=q.front(); q.pop(); v.push_back(front->val); if(front->left) q.push(front->left); if(front->right) q.push(front->right); } vv.push_back(v); //现在的leveSize等于当前队列的size levelSize=q.size(); } return vv; } }; 

结尾:

往期回顾:

《C++ 手搓list容器底层》:从结构原理深度解析到功能实现(附源码版)

总结:Stack 和 Queue 作为 C++ 标准库中经典的适配器容器,凭借明确的访问规则在各类场景中大显身手。掌握它们的基础操作,再结合实战习题打磨,就能轻松应对算法与业务中的数据管理需求,快去实践吧

Read more

【开源工具】超全Emoji工具箱开发实战:Python+PyQt5打造跨平台表情管理神器

【开源工具】超全Emoji工具箱开发实战:Python+PyQt5打造跨平台表情管理神器

🌟 超全Emoji工具箱开发实战:Python+PyQt5打造跨平台表情管理神器 🌈 个人主页:创客白泽 - ZEEKLOG博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情源自每一个灵感闪现的夜晚。愿以开源之火,点亮前行之路。 👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦 📖 概述 在当今数字化社交时代,Emoji已成为全球通用的视觉语言。本文介绍如何使用Python和PyQt5开发一个功能全面的Emoji工具箱,包含完整的Unicode 14.0标准表情库,提供分类浏览、智能搜索和快捷复制等功能。该项目具有以下技术亮点: * 采用MVC架构设计 * 支持跨平台运行(Windows/macOS/Linux) * 实现高性能的emoji渲染和搜索 * 提供现代化的UI交互体验 * 完整包含1800+个标准emoji 🎯 功能特性 1. 全量Emoji集合 * 涵盖9大分类体系 * 每个emoji包含官方名称标注 * 支持最新Unicode 14.0标准 2. 智能搜索系统 * 支持中文

By Ne0inhk

涛哥聊Python | 程序员必看:Codex 和 Claude Code 实战对比,差别比你想的更大!

本文来源公众号“涛哥聊Python”,仅用于学术分享,侵权删,干货满满。 原文链接:https://mp.weixin.qq.com/s/NPzwT-5_qt9ncWxYaaQpYg 程序开发,往往不只是思考逻辑,更多时间消耗在那些重复又琐碎的环节,接口需要写一堆模板代码,参数的小改动要牵连多个文件,修个 bug 还得来回补测试,这些工作不难,但却很耗时。 正因为如此,AI 编程助手逐渐进入开发者的日常,它们虽然不能完全替代人类思考,却能帮我们把重复的部分自动化。 在众多工具中,Codex 和 Claude Code 是讨论度最高的两个,一个专注于把自然语言快速翻译成代码,另一个则成为项目里的智能合作者,这两个工具的功能定位不相同,开发者可以根据自己的需求来选择最合适的助手。 Codex:从“人话”到“代码”的翻译官 Codex 的设计思路很直接:把自然语言转化为代码,只要用一句需求,它就能生成相应的实现,

By Ne0inhk
【测试基础】Python 核心语法,一篇搞定测试脚本开发基础

【测试基础】Python 核心语法,一篇搞定测试脚本开发基础

🔥个人主页: 中草药  🔥专栏:【Java】登神长阶 史诗般的Java成神之路 本文不做Python以及Pycharm安装的详细教程,请大家自行查阅资料,或到官网去下载         Python作为一门 “优雅且强大” 的编程语言,Python 凭借易上手、用途广的特点,成为很多人入门编程的首选。无论是数据分析、人工智能,还是 Web 开发、自动化脚本,Python 都能胜任。但想要用好 Python,扎实的基础语法是关键 —— 本文将结合系统的语法知识,从 “计算器” 级别的简单运算,到数据持久化的文件操作,带你一站式吃透 Python 核心语法,让你看完就能上手写代码! 变量与数据类型:程序的"原材料仓库"         变量就像快递盒,用来装不同类型的数据;数据类型则是快递盒上的标签,告诉我们里面装的是文件、水果还是电子产品。类型系统其实是在对变量进行 "归类"

By Ne0inhk
Python中的“==“与“is“:深入解析与Vibe Coding时代的优化实践

Python中的“==“与“is“:深入解析与Vibe Coding时代的优化实践

🌟 Python中的"=="与"is":深入解析与Vibe Coding时代的优化实践 * 1. 🧐 `==`与`is`的本质区别 * 2. 🕵️‍♂️ `is`判断对象身份 - 数组与常量池案例 * 案例1:列表对象的身份 * 案例2:小整数常量池 * 案例3:字符串驻留 * 3. 🔍 `==`与`__eq__`魔法函数 * 4. 🔎 类型判断的正确姿势:使用`is` * 5. 🚀 Vibe Coding时代的提示词优化 * 场景1:解释概念 * 场景2:代码生成 * 场景3:调试帮助 * 📊 对比总结表 * 💡 实际应用建议 * 🌈 结语 在Python的奇妙世界中,==和is这两个看似简单的操作符常常让初学者感到困惑。它们如同双胞胎,外表相似却性格迥异。本文将带你深入探索它们的区别,并通过生动的案例和图表展示它们的应用场景,

By Ne0inhk