校验给定字符串中的括号是否闭合

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. 方法逻辑

  1. 空字符串检查:

    • 如果输入字符串为空,返回 true 并设置 msg 为 "空字符串"。
  2. 初始化数据结构:

    • 创建一个 Stack<char> 以跟踪左括号。
    • 使用 Dictionary<char, char> 来存储左括号和右括号的配对关系。
    • 创建一个 HashSet<char> 存储所有的右括号,以便于快速查找。
  3. 遍历字符串:

    • 对于每个字符:
      • 如果是左括号,入栈。
      • 如果是右括号,检查栈是否为空或是否匹配:
        • 如果栈为空或匹配失败,设置 msg 并返回 false
  4. 最终检查:

    • 如果栈不为空,设置 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; // 返回是否完全闭合
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值