如何制作一个函数来检查字符串中括号的有效性



我编写了一个函数,用于检查某个字符串中的括号是否有效,如果有效则返回true,如果无效则返回false。

例如:

str1:{[a+b]-](c-d(]=false。

str2:{[a+b]-(c-d(}=true。

当我运行程序时,它不会给出任何输出,只是一个空白输出。

我需要更改什么?

public static Boolean BracketCheck(string str)
{
Stack<char> stk = new Stack<char>();
Stack<char> aid = new Stack<char>();
Stack<char> temp = new Stack<char>();
while (str != "")
{
char ch = str[0];
if(ch == '(' || ch == '{' || ch == '[' || ch == ')' || ch == '}' || ch == ']')
{
stk.Push(ch);
}
if(str.Length != 1)
str = str.Substring(1, str.Length - 1);
}
stk = Opposite(stk);
char first = stk.Pop();
char last;
while (!stk.IsEmpty() && !aid.IsEmpty())
{
while (!stk.IsEmpty())
{
aid.Push(stk.Top());
last = stk.Pop();
if (stk.IsEmpty())
if (int.Parse(first + "") + 1 != int.Parse(last + "") || int.Parse(first + "") + 2 != int.Parse(last + ""))
{
return false;
}
}
first = aid.Pop();
while (!aid.IsEmpty())
{
aid.Push(aid.Top());
last = aid.Pop();
if (aid.IsEmpty())
if (int.Parse(first + "") + 1 != int.Parse(last + "") || int.Parse(first +  "") + 2 != int.Parse(last + ""))
{
return false;
}
}
first = stk.Pop();
}
return true;
}
public static Stack<char> Opposite(Stack<char> stk)
{
Stack<char> temp = new Stack<char>();
while (stk.IsEmpty())
{
temp.Push(stk.Pop());
}
return temp;
}

你走的是正确的路(Stack(,但应该只有一个,而不是三个。仅检查括号有效性

public static Boolean BracketCheck(string str) {
if (string.IsNullOrEmpty(str))
return true;
Stack<char> expected = new Stack<char>();
foreach (char c in str) {
if (c == '(')
expected.Push(')');
else if (c == '[')
expected.Push(']');
else if (c == '{')
expected.Push('}');
else if (c == ')' || c == ']' || c == '}') {
if (expected.Count == 0 || expected.Pop() != c)
return false;
}
}
return expected.Count == 0;
}

如果您想将字符串验证为公式,例如(3 +) 5有效括号无效公式

您创建了aid,但在while (!stk.IsEmpty() && !aid.IsEmpty())行之前没有对其进行任何操作,因此aid为空,该循环中没有任何内容运行。

在代码审查网站上,还有一些问题可能会被更好地问到;例如,您不需要从字符串中删除字符来迭代其中的字符,也不需要将字符转换为整数来进行比较。从本质上讲,你想做的是创建一个堆栈,迭代字符串,任何左括号推到堆栈,任何右括号弹出堆栈,并检查左括号是否匹配,如果字符串末尾堆栈为空,那么它是有效的。你不需要所有的反转和创建第二个堆栈的东西。

这对我很有效。你认为有什么问题或需要改进的地方吗?

public static Boolean BracketCheck(string str)
{
Stack<char> stk = new Stack<char>();
foreach(char c in str)
{
if (c == '(' || c == '[' || c == '{')
{
stk.Push(c);
}
else if (c == ')' || c == ']' || c == '}')
{
if (stk.Top() == (int)c - 1 || stk.Top() == (int)c - 2)
{
stk.Pop();
}
}

}
return stk.IsEmpty();
}

相关内容

  • 没有找到相关文章

最新更新