Hello! 亲爱的小伙伴们,大家好呀!欢迎观看本篇博客,接下来让我们一起来学习一道算法题—— 括号匹配 吧!祝你有所收获!


题目描述

给定仅包含“()[]{}”六种括号的字符串,请你判断该字符串中,括号的匹配是否是合法的,也就是对应括号的数量、嵌套顺序完全正确。

输入格式:
第一行一个整数T(T<=10)

其后T行每行一个字符串只包含[{()}]六种字符(字符串长度2e5以内)

输出格式:
对于每个字符串,匹配输出Yes,否则输出No

输入样例:

2
{()[]}
([)]

输出样例:

Yes
No

括号匹配问题:利用栈结构巧解字符串谜题

在编程领域,括号匹配问题是一道经典的字符串处理挑战,常出现在各类算法面试与竞赛题目中。今天,我们就来深入剖析如何通过一种巧妙的数据结构——栈,高效判断给定字符串中括号的匹配合法性,即确保对应括号数量对等、嵌套顺序天衣无缝。

一、问题洞察:把握括号匹配规则核心

括号匹配遵循着一套直观却严谨的规则:每个右括号务必与离它最近的同类型左括号精准配对,而且从整体上看,括号的嵌套层级要条理清晰,不能错乱。这种“先进后出”的匹配模式,恰似栈数据结构的拿手好戏——后存入栈的元素优先被取出操作。于是,栈就成了我们解决此问题的不二利器,它能有条不紊地存储左括号,待右括号现身时,即时调出与之匹配的左括号进行核验。

二、代码剖析:步步为营拆解逻辑

#include <iostream>
#include <stack>

using namespace std;

int main() {
    int T;
    cin >> T;
    cin.ignore(); // 巧妙剔除换行符干扰,为后续精准读取字符串铺垫

    while (T-- > 0) {
        string line;
        getline(cin, line); // 逐行完整捕获输入字符串
        stack<char> chStack; // 为每组新字符串初始化专属栈空间
        bool isValid = true;

        for (char ch : line) {
            if (ch == '(' || ch == '[' || ch == '{') {
                chStack.push(ch); // 遇左括号,迅速压入栈顶保管
            } else {
                // 右括号登场,启动匹配核查流程
                if (chStack.empty()) {
                    isValid = false; // 栈空预警,意味着右括号无对应左伴,匹配告破
                    break;
                }
                char top = chStack.top();
                chStack.pop(); // 弹出栈顶元素,与当前右括号比对

                // 核心匹配校验,严审括号类型是否契合
                if ((ch == ')' && top!= '(') || 
                    (ch == ']' && top!= '[') || 
                    (ch == '}' && top!= '{')) {
                    isValid = false;
                    break;
                }
            }
        }

        // 收尾扫描,栈若非空,定有左括号滞留未配,匹配仍不合格
        if (!chStack.empty()) {
            isValid = false;
        }

        // 依据校验结果,精准输出判定结论
        cout << (isValid? "Yes" : "No") << endl;
    }

    return 0;
}

三、关键亮点:简洁代码蕴含精妙算法思维

  1. 精准匹配核查:代码摒弃复杂嵌套层级记录,单纯聚焦当前括号匹配,借助 top 变量瞬间比对右括号与栈顶左括号,一击即中判断对错,高效且直观。
  2. 栈结构的天然优势:栈的“后进先出”特性宛如为括号匹配量身定制。右括号一出现,栈自动奉上距它最近的左括号候配,顺序井然,嵌套层级无需额外费神校验,水到渠成保证正确。

四、嵌套奥秘:栈如何守护括号嵌套秩序

这段代码里,栈作为隐形秩序守护者,默默运作。从首个左括号入栈起,后续括号逐一处理。一旦右括号来袭,栈先自查是否空虚,为空则匹配无望;非空时,栈顶左括号出列匹配,类型不符即刻标记错误,全程环环相扣。最终若栈清空,意味着所有括号皆成双成对、嵌套得当;反之,残留括号宣告匹配失败。

五、总结升华:栈与括号匹配的完美邂逅

经由栈结构赋能,这一代码方案举重若轻化解括号匹配难题,不仅精准核验匹配完整性,更将嵌套顺序难题悄然化解于无形。无需繁琐流程追踪嵌套细节,只需聚焦括号进出栈瞬间,匹配真谛已然紧握在手。此般优雅解法,正是算法与数据结构精妙融合的魅力彰显,为我们处理复杂字符串逻辑点亮一盏明灯,指引通往高效编程的通途。


好啦,本篇文章到这里就结束啦,感谢小伙伴的观看!祝所有小伙伴学有所成!!
有任何想法,欢迎评论区留言讨论哦~

更多推荐