1. BracketPair
类
1.1. 概述
BracketPair
类用于表示一对括号,包括左括号和右括号。此类提供了一种便捷的方式来管理和传递括号对,简化了处理多种括号的逻辑。
1.2. 属性
char Left
:- 描述: 获取左括号字符。
- 访问修饰符:
public
char Right
:- 描述: 获取右括号字符。
- 访问修饰符:
public
1.3. 构造函数
BracketPair(char left, char right)
:- 描述: 初始化一个
BracketPair
实例。 - 参数:
left
: 左括号字符。right
: 右括号字符。
- 描述: 初始化一个
2. IsBracketsClosed
方法
2.1. 概述
IsBracketsClosed
是一个扩展方法,用于校验给定字符串中的括号是否闭合。该方法支持多种类型的括号,如圆括号 ()
, 花括号 {}
, 中括号 []
等。
2.2. 方法签名
public static bool IsBracketsClosed(this string source, out string msg, params BracketPair[] bracketPairs)
2.3. 参数
-
string source
:- 描述: 要检查的字符串。
-
out string msg
:- 描述: 输出参数,用于返回错误信息。如果字符串有效,返回空字符串;否则返回错误描述。
-
params BracketPair[] bracketPairs
:- 描述: 一组括号对,使用
BracketPair
类型表示每对括号。例如,可以传入new BracketPair('(', ')')
来表示圆括号。
- 描述: 一组括号对,使用
2.4. 返回值
- 返回类型:
bool
- 描述: 如果字符串中的括号完全闭合且匹配,返回
true
;否则返回false
。
2.5. 方法逻辑
-
空字符串检查:
- 如果输入字符串为空,返回
true
并设置msg
为 "空字符串"。
- 如果输入字符串为空,返回
-
初始化数据结构:
- 创建一个
Stack<char>
以跟踪左括号。 - 使用
Dictionary<char, char>
来存储左括号和右括号的配对关系。 - 创建一个
HashSet<char>
存储所有的右括号,以便于快速查找。
- 创建一个
-
遍历字符串:
- 对于每个字符:
- 如果是左括号,入栈。
- 如果是右括号,检查栈是否为空或是否匹配:
- 如果栈为空或匹配失败,设置
msg
并返回false
。
- 如果栈为空或匹配失败,设置
- 对于每个字符:
-
最终检查:
- 如果栈不为空,设置
msg
并返回false
。 - 如果栈为空,返回
true
并将msg
设置为空字符串。
- 如果栈不为空,设置
2.6. 使用示例
string input = "{[()]}";
bool isClosed = input.IsBracketsClosed(out string message,
new BracketPair('(', ')'),
new BracketPair('{', '}'),
new BracketPair('[', ']'));
if (isClosed)
{
Console.WriteLine("字符串中的括号是闭合的。");
}
else
{
Console.WriteLine($"错误: {message}");
}
2.7. 注意事项
- 确保在调用此方法时传递至少一对有效的括号。
- 此方法对输入的字符串不区分大小写,仅关注括号字符。
public class BracketPair
{
public char Left { get; }
public char Right { get; }
public BracketPair(char left, char right)
{
Left = left;
Right = right;
}
}
/// <summary>
/// 校验字符串中的符号是否闭合
/// </summary>
/// <param name="source">要检查的字符串</param>
/// <param name="msg">错误信息</param>
/// <param name="bracketPairs">左右括号对,例如:{ new BracketPair('(', ')') }</param>
/// <returns>是否闭合</returns>
public static bool IsBracketsClosed(this string source, out string msg, params BracketPair[] bracketPairs)
{
if (string.IsNullOrEmpty(source))
{
msg = "空字符串";
return true;
}
var stack = new Stack<char>();
var bracketMap = bracketPairs.ToDictionary(b => b.Left, b => b.Right);
var rightBrackets = new HashSet<char>(bracketPairs.Select(b => b.Right));
foreach (char c in source)
{
if (bracketMap.ContainsKey(c))
{
stack.Push(c); // 左括号入栈
}
else if (rightBrackets.Contains(c))
{
if (stack.Count == 0 || bracketMap[stack.Pop()] != c)
{
msg = "字符串中存在多余的右括号或不匹配的括号";
return false;
}
}
}
msg = stack.Count == 0 ? "" : "字符串中存在不匹配的括号";
return stack.Count == 0; // 返回是否完全闭合
}