我想检查给定的字符串是否如下所示:
(a[i]+{-1}*(8-9))是有效的
有效方法:
([]{}()) 这是可以的,无效的是:
{([[}))我正在尝试通过stacks来实现这一点。
首先,堆栈提取这3个括号中的任意一个,并反向推送它。第二个堆栈再次推送它,所以如果我有:
( [ ] { } ( ) )第一个堆栈获取:
) ] } )第二个堆栈获取:
) } ] )现在是逻辑部分。
我找到了一个非常丑陋的解决方案。理想是什么?(请不要让我发布我的解决方案,因为它是有效的,但它只是凌乱和糟糕的,远离“理想”)
不管怎样,这是我的算术字符串和2个堆栈:
public static string aritmethic { get; } = "( a[i]+{-1}*(8-9) )";
Stack<char> original = new Stack<char>();
Stack<char> temp = new Stack<char>();下面是第一个堆栈反向推送:
public void PushToOriginal()
{
for (int i = 0; i < aritmethic.Length; i++)
{
if ((aritmethic[i] == '{'))
{
original.Push('}');
}
else if (aritmethic[i] == '[')
{
original.Push(']');
}
else if (aritmethic[i] == '(')
{
original.Push(')');
}
}
}第二次堆栈推送:
public void PushToTemp()
{
for (int i = 0; i < original.Count; i++)
{
temp.Push(original.Pop());
}
}现在我需要一个合理的逻辑:
public void Checker()
{
//Logic here
/*
if (temp.Peek() == ....)
temp.Pop();
*May cause an error
*/
if (temp.Count == 0)
Console.WriteLine("Aritmethic Matches!");
else
Console.WriteLine("Aritmethic does not Match!!");
}
}希望我的问题说得够清楚了。谢谢!顺便说一句,我对CSharp真的很陌生,所以对我来说不要苛刻!
发布于 2016-04-08 06:34:49
您可以非常简单地使用单个堆栈和通过输入字符串的单个遍来完成所有这些操作:
var openers = "([{";
var closers = ")]}";
var brackets = new Stack<char>();
for (int i = 0; i != s.Length; ++i) {
if (openers.Contains(s[i]))
brackets.Push(s[i]);
else if (closers.Contains(s[i])) {
var opener = openers[closers.IndexOf(s[i])];
if (brackets.Count == 0 || brackets.Peek() != opener)
Console.WriteLine("Mismatched '{0}' at {1}", s[i], i);
else
brackets.Pop();
}
}
if (brackets.Count != 0)
Console.WriteLine("Unmatched '{0}'", brackets.Peek());这之所以有效,是因为当您遇到左方括号时,您期望的下一件事就是匹配的右方括号(或创建嵌套范围的另一个左方括号)。因此,对于每个左括号,代码都会将一个新状态推送到堆栈上,当遇到右括号时,它会弹出该状态(检查它们是否匹配)。
发布于 2016-04-08 06:40:21
static void Main(String[] args)
{
string input = "{()}";
bool success = true;
HashSet<char> openBrackets = new HashSet<char>() { '(', '{', '[' };
HashSet<char> closeBrackets = new HashSet<char>() { ')', '}', ']' };
Stack<char> mystack = new Stack<char>();
for (int i = 0; i < input.Length; i++)
{
if (openBrackets.Contains(input[i]))
mystack.Push(input[i]);
else if (closeBrackets.Contains(input[i])){
if(mystack.Count == 0)
{
success = false;
break;
}
if (input[i] == '}' && mystack.Peek() == '{')
mystack.Pop();
else if (input[i] == ')' && mystack.Peek() == '(')
mystack.Pop();
else if (input[i] == ']' && mystack.Peek() == '[')
mystack.Pop();
else
{
success = false;
break;
}
}
}
if (mystack.Count == 0 && success)
Console.WriteLine("Correct Input");
else Console.WriteLine("Incorrect input");
Console.ReadKey();
}算法: 1.创建一个新的堆栈!!2.当你遇到左方括号时,将它推送到堆栈上。3.当你遇到结束括号时,检查堆栈顶部的当前元素是结束括号的对应括号。如果是,则弹出堆栈的顶部元素。4.最后检查堆栈中的其余元素是否为零!
https://stackoverflow.com/questions/36488260
复制相似问题