C#控制平衡括号到递归

时间:2015-07-28 07:06:41

标签: c# algorithm recursion parentheses

我正在尝试编写一个函数来控制public bool IsBalanced(string input) { //last condition, gets out if (string.IsNullOrEmpty(input)) return true; int numOpen = 0; bool opened = false; foreach (char c in input) { if (char.ToUpperInvariant(c) =='(') { opened = true; numOpen+=1; } if (char.ToUpperInvariant(c) == ')') { if (opened) { numOpen-=1; opened = numOpen > 0; } else return false; //incorrect position parentheses, closes but not opened } } return numOpen == 0; } 中包含的括号是否平衡。

我写了以下函数:

Form1.cs
Form1.Designer.cs
Form1.resx

我想将其更改为递归函数,但无法执行此操作。任何人都可以提示如何做到这一点吗?

4 个答案:

答案 0 :(得分:3)

嗯,你的算法并不漂亮。这是一个更好的

int check = 0;
foreach (var c in input)
{
    if (c == '(') {
        check++;
    } else if (c == ')') {
        check--;
    }
    if (check < 0) {
        return false; // error, closing bracket without opening brackets first
    }
}
return check == 0; // > 0 error, missing some closing brackets

要使其(检查平衡括号的算法)递归,您可以使用以下

bool IsBalanced(string input)
{
    var first = input.IndexOf('('); // first opening bracket position
    var last = input.LastIndexOf(')'); // last closing bracket position
    if (first == -1 && last == -1)
        return true; // no more brackets - balanced
    if (first == -1 && last != -1 || first != -1 && last == -1)
        return false; // error - one of brackets is missing
    if (first > last)
        return false; // error - closing bracket is BEFORE opening
    return IsBalanced(input.Substring(first, last - first)); // not sure, might need to tweak it, parameter should be without first and last bracket (what is inside)
}

这只是删除第一个开始括号和最后一个右括号,并传递剩下的参数(递归),直到满足其中一个结束条件。

答案 1 :(得分:2)

基本思想是采用变量(在本例中为numOpen)作为参数。 这是我的代码:

public bool IsBalancedRec(string input, int numOpen = 0)
{
    if (numOpen < 0)
        return false;
    if (string.IsNullOrEmpty(input))
        return numOpen == 0;

    char c = input[0];
    string rest = input.Substring(1);

    if (c == '(')
        return IsBalancedRec(rest, numOpen + 1);
    else if (c == ')')
        return IsBalancedRec(rest, numOpen - 1);
    else
        return IsBalancedRec(rest, numOpen);
}

并将其称为IsBalancedRec("so(m(eth)ing)")

答案 2 :(得分:2)

使用堆栈实现:

Stack myStak = new Stack();
    public bool IsBalanced(string input)
    {
        if (input.ToArray().Count() != 0)
        { 
            if(input.ToArray()[0] == '(')
            {
                myStak.Push('(');
            }
            else if(input.ToArray()[0] == ')')
            {
                if (myStak.Count != 0)
                    myStak.Pop();
                else
                {
                    //not balanced
                    return false;
                }
            }
            return IsBalanced(input.Substring(1));
        }
        else
        {
            if (myStak.Count == 0)
            {
                //balanced
                return true;
            }
            else
            {
                //not balanced
                return false;
            }
        }
    }

答案 3 :(得分:1)

  public static bool IsBalanced(string input)
    {
        int numOpen = 0;
        while(input != "")
        {
            char c = input[0];
            input = input.Substring(1);
            numOpen = c == '(' ? (numOpen + 1) : (c == ')' ? (numOpen - 1) : numOpen);
        }
        return numOpen == 0;
    }