pta算法题目讲解:括号匹配
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;
}
三、关键亮点:简洁代码蕴含精妙算法思维
- 精准匹配核查:代码摒弃复杂嵌套层级记录,单纯聚焦当前括号匹配,借助
top变量瞬间比对右括号与栈顶左括号,一击即中判断对错,高效且直观。 - 栈结构的天然优势:栈的“后进先出”特性宛如为括号匹配量身定制。右括号一出现,栈自动奉上距它最近的左括号候配,顺序井然,嵌套层级无需额外费神校验,水到渠成保证正确。
四、嵌套奥秘:栈如何守护括号嵌套秩序
这段代码里,栈作为隐形秩序守护者,默默运作。从首个左括号入栈起,后续括号逐一处理。一旦右括号来袭,栈先自查是否空虚,为空则匹配无望;非空时,栈顶左括号出列匹配,类型不符即刻标记错误,全程环环相扣。最终若栈清空,意味着所有括号皆成双成对、嵌套得当;反之,残留括号宣告匹配失败。
五、总结升华:栈与括号匹配的完美邂逅
经由栈结构赋能,这一代码方案举重若轻化解括号匹配难题,不仅精准核验匹配完整性,更将嵌套顺序难题悄然化解于无形。无需繁琐流程追踪嵌套细节,只需聚焦括号进出栈瞬间,匹配真谛已然紧握在手。此般优雅解法,正是算法与数据结构精妙融合的魅力彰显,为我们处理复杂字符串逻辑点亮一盏明灯,指引通往高效编程的通途。
好啦,本篇文章到这里就结束啦,感谢小伙伴的观看!祝所有小伙伴学有所成!!
有任何想法,欢迎评论区留言讨论哦~
更多推荐


所有评论(0)