Der Ausdruck:C# Prüfen, ob Ausdruck Klammern gültig
"(a [i] + {- 1} * (8-9))"
sollte true zurückgeben, da es gültig, um eine solche Syntax zu schreiben. Jede linke Klammer hat einen rechten näher an der richtigen Stelle und alle Klammern sind an legalen Positionen.
Ich habe versucht, dies über einen Stapel zu tun, und ich weiß, wo ich falsch liege, aber ich möchte einen relevanten Weg, um das zu lösen wissen. Danke!
Mein poor falscher Code:
string expression = "(a[i]+{-1}*(8-9)) ";
Stack<char> expStack = new Stack<char>();
List<char> rightBracketsHolder = new List<char>();
for (int i = 0; i < expression.Length; i++)
{
if (expression[i] == '{')
{
expStack.Push('}');
Console.Write("}" + " ");
}
else if (expression[i] == '(')
{
expStack.Push(')');
Console.Write(")" + " ");
}
else if (expression[i] == '[')
{
expStack.Push(']');
Console.Write("]" + " ");
}
}
Console.WriteLine();
for (int i = 0; i < expression.Length; i++)
{
if (expression[i] == '}')
{
rightBracketsHolder.Add('}');
Console.Write(expression[i] + " ");
}
else if (expression[i] == ')')
{
rightBracketsHolder.Add(')');
Console.Write(expression[i] + " ");
}
else if (expression[i] == ']')
{
rightBracketsHolder.Add(']');
Console.Write(expression[i] + " ");
}
}
Console.WriteLine();
bool stackResult = checkValidity(expStack, rightBracketsHolder);
if (stackResult)
Console.WriteLine("Expression is Valid.");
else
Console.WriteLine("\nExpression is not valid.");
Console.ReadKey();
}
private static bool checkValidity(Stack<char> expStack, List<char> leftBracketsHolder)
{
Console.WriteLine();
int length = leftBracketsHolder.Count;
for (int i = 0; i < length; i++)
{
if (expStack.Peek().ToString().Contains(leftBracketsHolder.ToString()))
{
leftBracketsHolder.Remove(expStack.Peek());
expStack.Pop();
}
}
if (expStack.Count == 0 && leftBracketsHolder.Count ==0)
{
return true;
}
return false;
}
}
Ich denke, Sie sollten arithmetischen Ausdruck Parser verwenden. Sehen Sie sich diese [Frage] an (http://stackoverflow.com/questions/3972854/parse-math-expression) –