【问题标题】:How to detect } bracket error with stack? [closed]如何用堆栈检测 } 括号错误? [关闭]
【发布时间】:2011-12-05 00:14:23
【问题描述】:

我的代码可以检测到 { 括号错误,如果文件中只有 } 括号,那么它将抛出空堆栈异常。我想知道如何检测两个括号错误,如果 { this 或 } 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);
        }
    }

【问题讨论】:

  • 如果您的测试文件包含Console.WriteLine("{")Console.WriteLine("}") 之类的内容怎么办?你需要忽略字符和字符串中的大括号吗?
  • 我只需要检查 CS 文件的 {} 括号,就像 Visual Studio IDE 一样。
  • 那么你还需要考虑这些字符和字符串。

标签: c# visual-studio-2010 data-structures stack


【解决方案1】:

如果你没有最后的右大括号,那么堆栈中会留下一些东西,如果堆栈中有任何元素,最后简单地返回。如果你不这样做,表达式是无效的。

另一种情况是你有一个没有正式表达式的右大括号,在这种情况下你会遇到 } 但堆栈是空的(错误)。

因此,一旦您检查了堆栈,您就可以确保 { } 中包含的所有表达式都是正确的,而不是堆栈上没有未检查的元素,因此 stack.Empty() 为真,那么该表达式是有效的。

【讨论】:

  • 我需要修改我的代码,而不仅仅是理论上的答案。
  • @AqibSaeed 你比我更了解你的代码,你应该能够将逻辑转移到你的代码中,如果你不能,我还有什么希望?
猜你喜欢
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多