2016-04-21 5 views
0

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; 
    } 
} 
+0

Ich denke, Sie sollten arithmetischen Ausdruck Parser verwenden. Sehen Sie sich diese [Frage] an (http://stackoverflow.com/questions/3972854/parse-math-expression) –

Antwort

1

Dieser Code wird Ihren Zweck lösen -

static void Main(string[] args) 
    { 
     bool error = false; 
     var str = "(a[i]+{-1}*(8-9))"; 
     Stack<char> stack = new Stack<char>(); 
     foreach (var item in str.ToCharArray()) 
     { 
      if (item == '(' || item == '{' || item == '[') 
      { 
       stack.Push(item); 
      } 
      else if(item == ')' || item == '}' || item == ']') 
      { 
       if (stack.Peek() != GetComplementBracket(item)) 
       { 
        error = true; 
        break; 
       } 
      } 
     } 

     if (error) 
      Console.WriteLine("Incorrect brackets"); 
     else 
      Console.WriteLine("Brackets are fine"); 
     Console.ReadLine(); 
    } 

    private static char GetComplementBracket(char item) 
    { 
     switch (item) 
     { 
      case ')': 
       return '('; 
      case '}': 
       return '{'; 
      case ']': 
       return '['; 
      default: 
       return ' '; 
     } 
    } 
0

Sie müssen die Dinge aus dem Stapel Pop wie das Schließen erfolgt. Probieren Sie den folgenden Code aus. Es wird eine offene Klammer/Klammer/Klammer auf den Stapel drücken und das erste Ding wird dann durch einen entsprechenden Schlussteil vom Stapel entfernt. Ansonsten ist es ungültig. Wenn beim Schließen keine Öffnung auf dem Stapel vorhanden ist, ist sie ungültig. Wenn Sie nach dem Abschluss noch weitere Extras öffnen, ist dies ungültig.

Ich habe auch eine switch-Anweisung anstelle einer if-Anweisung verwendet, nur weil ich dachte, dass es einfacher zu lesen war.

using System; 
using System.Collections.Generic; 

public class Program 
{ 
    public static void Main() 
    { 
     string expression = "(a[i]+{-1}*(8-9)) "; 
     bool stackResult = checkValidity(expression); 

     if (stackResult) 
     Console.WriteLine("Expression is Valid."); 
     else 
     Console.WriteLine("\nExpression is not valid."); 
    } 

    private static bool checkValidity(string expression) 
    { 
     Stack<char> openStack = new Stack<char>(); 
     foreach (char c in expression) 
     { 
     switch (c) 
     { 
      case '{': 
      case '(': 
      case '[': 
       openStack.Push(c); 
       break; 
      case '}': 
       if (openStack.Count == 0 || openStack.Peek() != '{') 
       { 
        return false; 
       } 
       openStack.Pop();  
       break; 
      case ')': 
       if (openStack.Count == 0 || openStack.Peek() != '(') 
       { 
        return false; 
       } 
       openStack.Pop();  
       break; 
      case ']': 
       if (openStack.Count == 0 || openStack.Peek() != '[') 
       { 
        return false; 
       } 
       openStack.Pop();  
       break; 
      default: 
       break; 
     } 
     } 
     return openStack.Count == 0; 
    } 
}