测试括号是否平衡,a {[] b{}} c[]返回false,但应为true

问题描述

代码的目的是测试每组字符串中的括号是否平衡。有12项测试必须全部通过,目前,我有11项工作,但是最后一项将无法工作。 目前,我有3个静态布尔变量,用于澄清什么被归类为括号以及它们是否匹配。

public class CompanyResult
{
    public long CompanyId { get; set; }
    public long ConfigurationId { get; set; }
    public string Name { get; set; }
    public string ConfigurationV { get; set; }
}

var query = _db.From<Company>
                .Join<CompanyConfiguration>((c,cc) => c.idCompany == cc.idCompany)
                .Where(c => c.idCompany == companyId)
                .Select<CompanyConfiguration>((c,cc) = new {
                    CompanyId = c.idCompany,ConfigurationId = cc.idCompanyConfiguration,Name = c.companyName,ConfigurationV - cc.companyConfigurationV
                });
var results = _db.Single<CompanyResult>(query);

下面,我有一个bool实际检查它们是否匹配,这就是我的错误所在。

 private static bool IsopeningParenthesis(char c)
        {
            return c == '(' || c == '[' || c == '{';
        }

private static bool IsClosingParenthesis(char c)
        {
            return c == ')' || c == ']' || c == '}';
        }

private static bool Matches(char a,char b)
        {
            return (a == '(' && b == ')') || (a == '[' && b == ']') ||
                (a == '{' && b == '}');
        }

最后的代码,这些是所有正在检查的测试。我目前正在为9号测试/ TestFLongMatch苦苦挣扎。

public static bool IsBalanced(string s)
        {
            Stack<char> myStack = new Stack<char>();

            foreach (char c in s)
            {
                if (IsopeningParenthesis(c))
                {
                    myStack.Push(c);
                }
                if (IsClosingParenthesis(c))
                {
                    if (myStack.Count == 0) //takes care of closing parenthesis before adding char d
                    {
                        return false;
                    }
                    char d =  myStack.Pop();
                    if (c == d)
                    {
                        return true;
                    }
                    else
                    {
                        myStack.Push(d);
                        return false;
                    }   
                }
            }
            if(myStack.Count == 0)
            {
                return true;
            }
            else
            {
                return false;
            }

        }

下面是带有所有测试的完整文件

public void TestFLongmatch()
        {
            Assert.That(ParenthesisMatcher.IsBalanced("(a{[]b({})}c)[]"),Is.True);
        }

当我通过调试器运行特定的测试时,代码将正常工作并贯穿字符串,直到到达第一个结束括号为止。 一旦右括号开始起作用,并且从测试中删除了左括号和右括号,并且程序停止返回false。但是,应该继续通过字符串并返回True。老实说,我在这代码上迷失了,因为其他与之非常相似的匹配字符串通过了,并且在第一个结束点之后没有退出

任何有关如何解决此问题的建议将不胜感激。如果需要其他任何方法来帮助解决此问题,请告诉我,我尝试提供尽可能多的信息。

解决方法

从查看代码的角度来看,我认为问题在于您的IsBalanced方法在遇到右括号后立即返回false

在您的代码中,遇到右括号时,这些选项是:

  1. 堆栈上没有任何物品:return false
  2. 堆栈中的第一项是相同的右括号(不可能):return true
  3. return false

要解决此问题,您可能想使用Matches方法来检查右括号是否与从堆栈中弹出的字符匹配:

public static bool IsBalanced(string input)
{
    var stack = new Stack<char>();

    foreach (var chr in input)
    {
        if (IsOpeningParenthesis(chr))
        {
            stack.Push(chr);
        }
        else if (IsClosingParenthesis(chr))
        {
            if (stack.Count == 0) return false;
            if (!Matches(stack.Pop(),chr)) return false;
        }
    }

    return stack.Count == 0;
}