首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

检查成对的符号输入异常()、[]、{}等

2013-09-14 
检查成对的符号输入错误()、[]、{}等如题,找个方法,检查()、[]、{}这些成对的符号在输入时错位或者少输入了一

检查成对的符号输入错误()、[]、{}等
如题,找个方法,检查()、[]、{}这些成对的符号在输入时错位或者少输入了一个,如下面的几句话:
1.我来自Hongkong)香港(。
2.地球属于]银河系[,不属于[太阳系]。
3.饿饿微软撒地方(阿三地方),阿三地方]阿三地方[,这本书[西游记]。
类似于上面3种句子,里面的符号顺序错位了,或者还可能少输入了,能有什么办法检查出来。感谢各位帮忙。
[解决办法]
c#就是好,有现成的栈,c语言还要自己实现呢


static bool ParseString(string str)
{
     bool result = false;
     Stack<char> symbols = new Stack<char>();

     for (int i = 0; i < str.Length; i++)
     {
         char ch = str[i];
         switch (ch)
         {
              case '(':
              case '[':
              case '{':
                   symbols.Push(ch);
                   break;

              case ')':
                    if (symbols.Count > 0 && symbols.Peek() == '(')
                        symbols.Pop();
                    else
                        return false;
                     break;


              case ']':
                    if (symbols.Count > 0 && symbols.Peek() == '[')
                        symbols.Pop();
                    else
                        return false;
                    break;
              case '}':
                    if (symbols.Count > 0 && symbols.Peek() == '}')
                        symbols.Pop();
                    else
                        return false;
                    break;
         }
     }
     if (symbols.Count == 0) result = true;
         return result;
}


[解决办法]
只能找缺少的符号,

public class Symbol
{
    public int Index { get; set; }
    public char Code { get; set; }
    public string Error { get; set; }

    public static int SortByIndex(Symbol obj1, Symbol obj2)
    {
        int result = 0;
        if (obj1.Index > obj2.Index) result = 1;
        else if (obj1.Index < obj2.Index) result = -1;


        else result = 0;
        return result;
    }
}

public class SymbolTable
{
    public static Dictionary<char, char> Left_Symbol_Table = new Dictionary<char, char>();
    public static Dictionary<char, char> Right_Symbol_Table = new Dictionary<char, char>();
    static SymbolTable()
    {
        Left_Symbol_Table.Add('(', ')');
        Left_Symbol_Table.Add('[', ']');

        Left_Symbol_Table.Add('{', '}');
        Left_Symbol_Table.Add('<', '>');

        foreach (KeyValuePair<char, char> kp in SymbolTable.Left_Symbol_Table)
        {
            Right_Symbol_Table.Add(kp.Value,kp.Key);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        string[] test =
        {
            "1.我来自Hongkong)香港(。",
            "2.地球属于]银河系[,不属于[太阳系]。",
            "3.饿饿微[软撒地方(阿三地方),阿三地方]阿三地[[[方[,这本书[西游记]。"
        };

        foreach (string str in test)
        {
            Console.WriteLine(str);
            IList<Symbol> errors = ParseString(str);
            foreach (Symbol err in errors)
            {
                Console.WriteLine("\t" + err.Error);
            }
            Console.WriteLine();


        }
        Console.ReadLine();
    }

    public static IList<Symbol> ParseString(string str)
    {
        List<Symbol> errorList = new List<Symbol>();
        Stack<Symbol> symbols = new Stack<Symbol>();

        string errorMsg = "Error index:{0}---缺少符号:'{1}'!";

        for (int i = 0; i < str.Length; i++)
        {
            char ch = str[i];
            if (SymbolTable.Left_Symbol_Table.Keys.Contains(ch))
            {
                symbols.Push(new Symbol()
                {
                    Index = i,
                    Code = ch,
                    Error = string.Format(errorMsg, i, SymbolTable.Left_Symbol_Table[ch])
                });
                continue;
            }
            if (SymbolTable.Right_Symbol_Table.Keys.Contains(ch))
            {
                if (symbols.Count > 0 && symbols.Peek().Code == SymbolTable.Right_Symbol_Table[ch])
                {
                    symbols.Pop();
                }
                else


                {
                    errorList.Add(new Symbol()
                    {
                        Index = i,
                        Code = ch,
                        Error = string.Format(errorMsg, i, SymbolTable.Right_Symbol_Table[ch])
                    });
                }
                continue;
            }
        }

        while (symbols.Count > 0)
            errorList.Add(symbols.Pop());
        errorList.Sort(Symbol.SortByIndex);

        return errorList;
    }
}


检查成对的符号输入异常()、[]、{}等

热点排行