括号匹配校验是字符串处理中常见的需求,核心思路是利用栈的后进先出特性,处理字符串中出现的各类括号配对问题。常见的括号包括圆括号、方括号、花括号,校验时需要保证左括号和右括号的类型、数量、顺序都完全匹配。

算法核心逻辑
整个校验流程可以分为以下几个步骤:
- 初始化一个空栈,用来存储遍历过程中遇到的左括号
- 遍历字符串的每个字符,对字符进行分类处理
- 如果当前字符是左括号(
(、[、{),将其压入栈中 - 如果当前字符是右括号(
)、]、}),先判断栈是否为空,为空则直接返回校验失败;不为空则取出栈顶元素,判断是否与当前右括号匹配,匹配则弹出栈顶,不匹配则返回校验失败 - 遍历结束后,判断栈是否为空,为空说明所有左括号都匹配完成,校验通过;不为空说明存在未匹配的左括号,校验失败
匹配规则说明
括号的匹配对应关系如下:
| 左括号 | 右括号 |
|---|---|
| ( | ) |
| [ | ] |
| { | } |
完整代码实现
下面是使用C++标准库的stack容器实现的完整校验函数:
#include <iostream>
#include <stack>
#include <string>
#include <unordered_map>
using namespace std;
// 校验字符串括号是否匹配的函数
bool isValidBracket(string s) {
// 定义右括号到左括号的映射,方便匹配判断
unordered_map<char, char> bracketMap = {
{')', '('},
{']', '['},
{'}', '{'}
};
// 初始化栈容器
stack<char> st;
// 遍历字符串每个字符
for (char c : s) {
// 判断当前字符是否是右括号
if (bracketMap.find(c) != bracketMap.end()) {
// 栈为空,说明没有对应的左括号,直接返回失败
if (st.empty()) {
return false;
}
// 取出栈顶元素
char top = st.top();
st.pop();
// 判断栈顶左括号是否和当前右括号匹配
if (top != bracketMap[c]) {
return false;
}
} else if (c == '(' || c == '[' || c == '{') {
// 当前是左括号,压入栈中
st.push(c);
}
// 其他非括号字符不影响校验,直接跳过
}
// 遍历结束后栈为空说明所有括号都匹配完成
return st.empty();
}
int main() {
// 测试用例
string test1 = "()[]{}";
string test2 = "([)]";
string test3 = "{[]}";
string test4 = "(";
cout << "测试字符串1:" << test1 << ",校验结果:" << (isValidBracket(test1) ? "通过" : "不通过") << endl;
cout << "测试字符串2:" << test2 << ",校验结果:" << (isValidBracket(test2) ? "通过" : "不通过") << endl;
cout << "测试字符串3:" << test3 << ",校验结果:" << (isValidBracket(test3) ? "通过" : "不通过") << endl;
cout << "测试字符串4:" << test4 << ",校验结果:" << (isValidBracket(test4) ? "通过" : "不通过") << endl;
return 0;
}
代码说明
上述代码中使用了unordered_map来存储右括号和对应左括号的映射关系,这样在判断右括号匹配时不需要写多个条件分支,代码更简洁。遍历字符串时,只有左括号会被压入栈,右括号会触发匹配逻辑,其他字符比如字母、数字、运算符等都不会影响校验结果,符合实际开发中字符串可能包含多种内容的场景。
边界情况处理
需要注意几个容易出错的边界情况:
- 字符串为空时,没有括号,校验结果应该为通过,上述代码中空字符串遍历后栈为空,会返回true,符合预期
- 字符串只有右括号时,栈始终为空,每次遇到右括号都会直接返回false,校验通过
- 左括号数量多于右括号时,遍历结束后栈不为空,返回false
- 右括号数量多于左括号时,会在遇到多余的右括号时栈为空,直接返回false
- 括号类型不匹配时,比如
(],会在匹配时判断栈顶左括号和当前右括号类型不一致,返回false
算法复杂度分析
时间复杂度:遍历字符串一次,每个字符的处理都是常数时间操作,所以时间复杂度是O(n),n是字符串的长度。
空间复杂度:最坏情况下所有字符都是左括号,栈需要存储n个元素,所以空间复杂度是O(n)。
C++栈_container括号匹配字符串校验修改时间:2026-06-25 09:12:27