跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

栈相关算法实战:模板实现与有效括号判定

综述由AI生成栈结构是处理后进先出问题的高效工具。通过【模板】栈题目演示了 STL 容器与数组模拟两种实现方式,重点说明数据类型范围的处理。针对有效括号问题,阐述了利用栈进行左右括号匹配的逻辑,涵盖空栈判断、类型不匹配及剩余未匹配字符的边界情况。代码示例包含 C++ 标准库用法及底层模拟细节,适合初学者巩固基础数据结构应用。

不羁发布于 2026/3/15更新于 2026/6/1016 浏览
栈相关算法实战:模板实现与有效括号判定

栈相关算法实战

一、【模板】栈

1.1 题目描述

本题要求实现一个栈的基本操作,包括入栈、出栈、查询栈顶元素以及获取栈的大小。数据范围较大,需注意变量类型的选择。

1.2 算法思路

实现栈主要有两种方式:

  1. 使用 C++ STL:利用 std::stack 容器,代码简洁,适合快速开发。
  2. 数组模拟:手动维护栈顶指针和数组,理解底层原理,性能可控。

注意点:题目中涉及的数据范围可能超出 int 范畴,建议使用 unsigned long long 存储数值。

1.3 代码实现

1.3.1 STL 版本
#include <iostream>
#include <stack>
using namespace std;

typedef unsigned long long ULL;
const int N = 1e6 + 10;

int main() {
    int t;
    cin >> t;
    while (t--) {
        stack<ULL> stk;
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++) {
            string s;
            cin >> s;
            if (s == "push") {
                ULL x;
                cin >> x;
                stk.push(x);
            } else if (s == "pop") {
                if (stk.empty()) cout << "Empty" << endl;
                else stk.pop();
            } else if (s == "query") {
                if (stk.empty()) cout << "Empty" << endl;
                else cout << stk.top() << endl;
            } else if (s == "size") {
                cout << stk.size() << endl;
            }
        }
    }
    return 0;
}
1.3.2 数组模拟版本
#include <iostream>
#include <string>
using namespace std;

typedef unsigned long long ULL;
const int N = 1e6 + 10;
ULL stk[N];

int main() {
    int t;
    cin >> t;
    while (t--) {
        int size = 0; // 当前栈的元素个数
        int top = 0;  // 栈顶位置(1-based)
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++) {
            string s;
            cin >> s;
            if (s == "push") {
                ULL x;
                cin >> x;
                stk[++top] = x;
            } else if (s == "pop") {
                if (!size) cout << "Empty" << endl;
                else top--;
            } else if (s == "query") {
                if (!size) cout << "Empty" << endl;
                else cout << stk[top] << endl;
            } else if (s == "size") {
                cout << size << endl;
            }
        }
    }
    return 0;
}

二、有效的括号

2.1 题目描述

给定一个只包括 '(', ')', '{', '}', '[', ']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合,且左括号必须以正确的顺序闭合。

2.2 算法思路

利用栈的后进先出特性进行匹配:

  1. 遍历字符串,遇到左括号直接入栈。
  2. 遇到右括号时,检查栈是否为空:
    • 若为空,说明没有对应的左括号,返回 false。
    • 若不空,弹出栈顶元素并检查类型是否匹配。不匹配则返回 false。
  3. 遍历结束后,若栈不为空,说明有未匹配的左括号,返回 false;否则返回 true。

2.3 代码实现

class Solution {
public:
    bool isValid(string s) {
        stack<char> stk;
        for (int i = 0; i < s.size(); i++) {
            char c = s[i];
            if (c == '(' || c == '[' || c == '{') {
                stk.push(c);
            } else {
                // 情况一:遇到右半部分但栈为空
                if (stk.empty()) return false;
                
                // 情况二:括号类型不匹配
                char top = stk.top();
                if ((c == ')' && top != '(') ||
                    (c == ']' && top != '[') ||
                    (c == '}' && top != '{')) {
                    return false;
                }
                
                // 情况三:匹配成功,弹出栈顶
                stk.pop();
            }
        }
        
        // 如果栈非空,说明还有左括号未匹配
        return stk.empty();
    }
};

以上两个案例展示了栈在基础数据结构中的典型应用。掌握栈的 STL 用法有助于提升编码效率,而数组模拟则能加深对内存管理的理解。在实际刷题中,注意边界条件(如空栈访问)是避免 Runtime Error 的关键。

目录

  1. 栈相关算法实战
  2. 一、【模板】栈
  3. 1.1 题目描述
  4. 1.2 算法思路
  5. 1.3 代码实现
  6. 1.3.1 STL 版本
  7. 1.3.2 数组模拟版本
  8. 二、有效的括号
  9. 2.1 题目描述
  10. 2.2 算法思路
  11. 2.3 代码实现
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 人形机器人躯干系统设计与结构方案
  • Qwen2.5 技术报告详解:架构、训练与长文本能力
  • 机器人身体结构与人体仿生学:人形机器人躯干系统
  • Linux 进程等待:wait/waitpid 与僵尸进程治理
  • C++ 笔试算法实战:排序子序列与贪心策略详解
  • MySQL 详细安装配置完整教程
  • FPGA 时钟架构解析:SRCC/MRCC 到全局时钟树设计
  • 大模型在安防领域的实践应用
  • Ubuntu 系统安装宝塔面板详细教程
  • FPGA 内部资源详解:LUT、FF、BRAM、DSP、PLL 及综合报告解读
  • WuliArt Qwen-Image Turbo 本地部署实战指南
  • Python 搭建 NLP 模型的详细步骤与代码
  • 详解 Python 常见文件后缀:.py、.ipynb、.pyi、.pyc、.pyd
  • Python 文本转语音转换器 GUI 应用
  • YOLOv8 旋转框角度回归优化:CSL 与 DCL 编码实战
  • 利用 DeepSeek 辅助儿童编程学习的实践路径
  • HTML5 Web Workers 详解:提升网页性能的关键技术
  • HTML5 Web Workers 实战:解决主线程阻塞与性能优化
  • 基于 Vue3+TS+Three.js 的 VR 全景看房应用实战
  • 谷歌 TurboQuant 内存压缩与 RWKV-6 开源重构大模型部署范式

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online