2011-10-11 67 views
-4

我的代碼可以檢測{括號錯誤,如果在文件中只有}括號,那麼它會拋出空棧異常。我想知道如何檢測兩個支架錯誤,如果{this或}這個支架丟失,那麼它會顯示錯誤。 類StackCS {如何檢測堆棧錯誤?

#region Vaiables 
    Stack stack; 
    char[] charArray; 
    string[] stringArray; 
    int linenumber; 

    string chError = string.Empty; 
    public string ChError { get { return chError +" "+ linenumber; } set { chError = value; } } 

    public StackCS() 
    { 
     charArray = new char[1000]; 
     stack = new Stack(); 
    } 

    #endregion 

    #region File 

    private void ReadCharFromFile(string add) 
    { 
     using (StreamReader rdr = new StreamReader(add)) 
     { 
      for (int i = 0; i < charArray.Length; i++) 
      { 
       charArray[i] = (char)rdr.Read(); 
      } 
     } 
    } 

    public void ReadFile(string add) 
    { 
     ReadCharFromFile(add); 
     stringArray = File.ReadAllLines(add); 
    } 

    #endregion 

    #region Stack 

    public void FillingStack() 
    { 
     for (int i = 0; i < charArray.Length; i++) 
     { 
      if (charArray[i] == '{') 
      { 
       stack.Push('{'); 
      } 
      else if (charArray[i] == '}') 
       stack.Pop(); 
     } 
    } 

    public void CheckingStack() 
    { 
     for (int i = 0; i < stringArray.Length; i++) 
     { 
      if (stack.Count != 0) 
      { 
       chError = "Error At:"; 
       linenumber = i; 
      } 
      else 
      { 
       chError = "No Error"; 
      } 
     } 
    } 

    public override string ToString() 
    { 
     string temp = string.Empty; 
     for (int i = 0; i < stringArray.Length; i++) 
     { 
      temp +=i+"\t\t"+stringArray[i] + "\n"; 
     } 
     return temp; 
    } 

    #endregion 

} 

     static void Main(string[] args) 
    { 
     StackCS obj = new StackCS(); 
     try 
     { 
      // set the file location, according to ur PC setting 

      obj.ReadFile(@"C:\Users\5609\Desktop\Class1.cs"); 
      obj.FillingStack(); 
      obj.CheckingStack(); 
      Console.WriteLine("Line Number" + "  " + "File Content"+"\n"); 
      Console.WriteLine(obj); 
      Console.WriteLine(obj.ChError); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 

      obj.CheckingStack(); 
      Console.WriteLine("Line Number" + "  " + "File Content" + "\n"); 
      Console.WriteLine(obj); 
      Console.WriteLine(obj.ChError); 
     } 
    } 
+0

如果你的測試文件包含類似於'Console.WriteLine(「{」)'或'Console.WriteLine(「}」)''?你需要忽略角色和字符串中的大括號嗎? –

+0

我只需要檢查CS文件的{}括號,就像Visual Studio IDE那樣。 –

+0

然後你需要考慮到這些字符和字符串。 –

回答

2

如果你沒有一個最終的右括號,然後事情會留在堆棧上,在最後簡單,如果你有堆棧中的任何元素返回。如果你不表達無效。

另一種情況是,你有一個沒有正式表達式的大括號,在這種情況下,你會遇到}但堆棧是空的(錯誤)。

因此,一旦檢查了堆棧,確保{}中包含的所有表達式都是正確的,沒有任何元素在堆棧中未被選中,所以stack.Empty()爲true,那麼表達式就是有效的。

+0

我需要修改我的代碼,而不僅僅是理論上的答案。 –

+5

@AqibSaeed你比我更瞭解你的代碼,你應該能夠將邏輯轉移到你的代碼中,並且如果你不能擁有我希望的東西? –