我想操纵给定的字符串或任何字符串,以便如果每个左括号都有一个右括号,那么很好。如果没有,我检查是否有更多左括号或右括号,反之亦然。如果开括号更多,那么我会在它后面插入一个右括号。如果右括号更多,那么我会在它之前插入一个左括号。
int count1 = 0, count2 = 0;
string sentence = ") (x + 2) )(";
foreach (char letter in sentence)
{
if (letter == '(')
count1++;
else if (letter == ')')
count2++;
}
if(count1 == count2)
Console.WriteLine("Correct use of parenthesis");
else
{
if(count1 > count2)
{
//How to find which opening parenthesis is the lonely one?
}
else
{
//How to find which closing parenthesis is the lonely one?
}
}
我正在考虑使用IndexOf方法来定位括号,如何找到正确的括号?! 我们赞赏没有使用正则表达式的解决方案(因为我仍然没有研究它们)。
我刚刚意识到使用数字来计算每个括号的数量并不能保证问题的正确结果。因为像“((x + 2)”这样的字符串会作为正确使用的括号出现。有什么方法可以确保正确使用括号?!
编辑: 所以我在阿列克谢提供的链接中实现了算法(顺便说一下)。我有一个问题,就是当问题出在左括号时,errorIndex变量是最后一个未关闭的左括号。但是,当问题出在右括号时,errorIndex变量是第一个未打开的右括号。
这段代码:
var aStack = new Stack<int>();
char openPar = '(';
char closePar = ')';
for (int index = 0; index < str.Length; index++)
{
if (str[index] == openPar)
aStack.Push(index);
else if(str[index] == closePar)
{
if(aStack.Count == 0)
{
errorIndex = index;
return false;
}
aStack.Pop();
}
}
if (aStack.Count == 0)
{
errorIndex = -1;
return true;
}
else
{
errorIndex = aStack.Peek();
return false;
}
}
在main方法中,此字符串str1 =“((((”;将错误索引返回到4)。 这个字符串str2 =“))))”;将其错误索引返回0。