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

蓝桥杯STL stack

STL stack 概述

栈(stack)是一种遵循**后进先出(LIFO)**原则的线性数据结构,仅允许在栈顶进行插入和删除操作。STL(Standard Template Library)中的 stack 是一个容器适配器,基于其他容器(如 dequelist)实现,默认使用 deque 作为底层容器。


栈的基本操作

初始化栈

STL stack 的初始化需要包含头文件 <stack>,并指定元素类型。

#include <stack>
using namespace std;stack<int> s; // 初始化一个存储整数的栈

入栈操作(push)

将元素添加到栈顶。

s.push(10); // 栈内元素: [10]
s.push(20); // 栈内元素: [10, 20]
s.push(30); // 栈内元素: [10, 20, 30]

出栈操作(pop)

移除栈顶元素,但不返回其值。

s.pop(); // 移除30,栈内元素: [10, 20]

访问栈顶元素(top)

返回栈顶元素的值,但不移除它。

int top_element = s.top(); // top_element = 20

检查栈是否为空(empty)

返回布尔值,判断栈是否为空。

bool is_empty = s.empty(); // 栈不为空,is_empty = false

获取栈的大小(size)

返回栈中元素的个数。

int stack_size = s.size(); // stack_size = 2


栈的典型应用场景

  1. 括号匹配问题
    检查表达式中的括号是否匹配,例如 {[()]} 是合法的,而 {[(])} 是非法的。

  2. 表达式求值
    实现中缀表达式转后缀表达式(逆波兰表达式),并计算其值。

  3. 深度优先搜索(DFS)
    用栈模拟递归过程,避免递归调用带来的额外开销。


蓝桥杯真题示例:括号匹配问题

问题描述

给定一个只包含 ()[]{} 的字符串,判断其括号是否匹配。

解决思路
  1. 遍历字符串,遇到左括号((, [, {)时入栈。
  2. 遇到右括号时,检查栈顶是否是对应的左括号:
    • 如果是,弹出栈顶。
    • 如果不是,直接返回不匹配。
  3. 遍历结束后,栈为空则匹配,否则不匹配。
完整代码
#include <iostream>
#include <stack>
#include <string>
using namespace std;bool is_valid(string s) {stack<char> st;for (char c : s) {if (c == '(' || c == '[' || c == '{') {st.push(c);} else {if (st.empty()) return false;char top = st.top();if ((c == ')' && top == '(') || (c == ']' && top == '[') || (c == '}' && top == '{')) {st.pop();} else {return false;}}}return st.empty();
}int main() {string s = "{[()]}";cout << (is_valid(s) ? "Valid" : "Invalid") << endl;return 0;
}


蓝桥杯解题通用思路

  1. 理解题意
    明确题目要求,例如输入输出格式、边界条件(如空栈、非法输入等)。

  2. 选择数据结构
    根据问题特性选择栈或其他数据结构。栈适合处理对称性或递归性质的问题。

  3. 设计算法
    将问题分解为栈的基本操作(如入栈、出栈、匹配等)。

  4. 编写代码
    实现算法,注意边界条件和异常处理。

  5. 测试验证
    通过样例测试和边界测试(如空输入、极端数据)验证代码正确性。


总结

STL stack 是解决一类特定问题(如括号匹配、表达式求值、DFS)的高效工具。在蓝桥杯竞赛中,熟练掌握栈的操作和应用场景能够帮助快速解决相关问题。通过实际代码示例和解题思路的训练,可以提升对栈的理解和运用能力。

http://www.xdnf.cn/news/17902.html

相关文章:

  • 【百度拥抱开源】百度开源文心一言视觉大模型—— ERNIE-4.5-VL
  • 《算法导论》第 24 章 - 单源最短路径
  • C# 贪吃蛇游戏
  • 审批流程系统设计与实现:状态驱动、灵活扩展的企业级解决方案
  • 调整磁盘分区格式为GPT
  • PyCharm性能优化与大型项目管理指南
  • 在CentOS系统中怎么查看Apache日志文件
  • Nginx学习笔记(八)—— Nginx缓存集成
  • ADB服务端调试
  • 机器学习学习报告
  • 考研408《计算机组成原理》复习笔记,第四章(2)——指令寻址和数据寻址
  • 飞算JavaAI:革新Java开发体验的智能助手
  • 19. 什么是 TypedArray
  • buildroot 简单介绍
  • LeetCode Day5 -- 二叉树
  • 【LeetCode】6. Z 字形变换
  • 【R语言】RStudio 中的 Source on Save、Run、Source 辨析
  • 热门手机机型重启速度对比
  • Vue项目生产环境性能优化实战指南
  • 相机按键功能解析
  • python学习DAY40打卡
  • Easysearch 数据迁移之 INFINI Gateway
  • 天文与航天领域专业计算库介绍
  • Java 大视界 -- Java 大数据机器学习模型在金融资产配置优化与风险收益平衡中的应用(395)
  • 使用dify搭建hr简历助手-上传简历-对接飞书ai表格
  • 八月补丁星期二:微软修复 111 个漏洞
  • Excel怎么筛选重复项?【图文详解】查找/删除重复项?查找重复项公式?如何去重?
  • 飞凌OK3568开发板QT应用程序编译流程
  • HTML5 Canvas实现数组时钟代码,适用于wordpress侧边栏显示
  • C# 反射和特性(元数据和反射)