蓝桥杯STL stack

STL stack 概述

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


栈的基本操作

初始化栈

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

cpp 复制代码
#include <stack>
using namespace std;

stack<int> s; // 初始化一个存储整数的栈
入栈操作(push)

将元素添加到栈顶。

cpp 复制代码
s.push(10); // 栈内元素: [10]
s.push(20); // 栈内元素: [10, 20]
s.push(30); // 栈内元素: [10, 20, 30]
出栈操作(pop)

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

cpp 复制代码
s.pop(); // 移除30,栈内元素: [10, 20]
访问栈顶元素(top)

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

cpp 复制代码
int top_element = s.top(); // top_element = 20
检查栈是否为空(empty)

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

cpp 复制代码
bool is_empty = s.empty(); // 栈不为空,is_empty = false
获取栈的大小(size)

返回栈中元素的个数。

cpp 复制代码
int stack_size = s.size(); // stack_size = 2

栈的典型应用场景

  1. 括号匹配问题

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

  2. 表达式求值

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

  3. 深度优先搜索(DFS)

    用栈模拟递归过程,避免递归调用带来的额外开销。


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

问题描述

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

解决思路
  1. 遍历字符串,遇到左括号((, [, {)时入栈。
  2. 遇到右括号时,检查栈顶是否是对应的左括号:
    • 如果是,弹出栈顶。
    • 如果不是,直接返回不匹配。
  3. 遍历结束后,栈为空则匹配,否则不匹配。
完整代码
cpp 复制代码
#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)的高效工具。在蓝桥杯竞赛中,熟练掌握栈的操作和应用场景能够帮助快速解决相关问题。通过实际代码示例和解题思路的训练,可以提升对栈的理解和运用能力。