蓝桥杯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)的高效工具。在蓝桥杯竞赛中,熟练掌握栈的操作和应用场景能够帮助快速解决相关问题。通过实际代码示例和解题思路的训练,可以提升对栈的理解和运用能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值