用栈结构优雅破解括号匹配难题(力扣20题)

一、题目重新解读
给定一个仅包含 ('、')、'['、']'、'{'、'}' 的字符串,判断其是否有效。有效需满足:
1. 左括号必须与相同类型的右括号闭合(如 () 对应,[] 对应,{} 对应);
2. 闭合顺序必须正确(先开的括号后闭);
3. 不存在未匹配的括号。
二、解题思路与过程
1. 栈结构特性:栈“后进先出(LIFO)”的特性天然适配括号匹配——后出现的左括号需先被匹配。
2. 遍历策略:
1.遇左括号直接压栈,记录“待匹配项”;
2.遇右括号时:
3.若栈空,说明右括号无对应左括号(如 ])),直接返回假;
4.若栈顶左括号与当前右括号不匹配(如 ][),返回假;
5.匹配成功则弹栈,继续下一字符。
3. 最终判断:遍历结束后,栈为空说明所有括号均匹配,否则存在剩余左括号(如 (])。
三、代码与注释
class Solution {
public:
// 判断字符是否为左括号的优雅舞步
bool IsLift(char a) {
return a == '(' || a == '[' || a == '{'; // 简洁的三重判断
}
bool isValid(string s) {
if(s.size()&1) return false; // 奇数长度直接谢幕
stack<char> s1; // 创建记忆栈
for(int i=0; i<s.size(); i++) {
if(IsLift(s[i])) {
s1.push(s[i]); // 收集未完成的期待
} else {
if(s1.empty()) return false; // 空栈遇右括号必定失格
// 检查栈顶元素是否与当前右括号共鸣
if( (s1.top()=='(' && s[i]==')') ||
(s1.top()=='[' && s[i]==']') ||
(s1.top()=='{' && s[i]=='}') ) {
s1.pop(); // 成功配对则释放栈顶
} else {
return false; // 不和谐音出现
}
}
}
return s1.empty(); // 最终校验所有期待都已满足
}
};原创内容 转载请注明出处






