簡體   English   中英

帶有特殊字符的格式良好的字符串 c#

[英]well formed string with special characters c#

如果輸入中的字符串由括號、方括號或大括號構成,我的程序需要輸出“true”

例子 :

Input : {([]){}()} ouput : true

Input : {L{}[{[a]}R]{2}} output : true

Input : {(}) output : false

Input : ][ output : false

訣竅是對齊,不計算打開和關閉的特殊字符。

是否有 Linq 或有條件的解決方案?

我們要確保正確使用()[]{}

我們使用堆棧 當觀察到范圍開啟器時,它被放置在堆棧內。

當到達結束分隔符時,將比較堆棧的頂部元素。 如果堆棧為空,則此范圍終止符不匹配任何開啟符且字符串無效。

如果棧不為空,則將元素從棧頂移除,如果其類型與范圍終止符的類型相同,則繼續滾動。

到達字符串末尾后,棧必須為空,否則范圍不閉合,字符串無效。

bool ValidBraces(string infix)
{
    bool valid = true;
    int i = 0;
    Stack<char> symbls = new Stack<char>();

    while (i < infix.Length)
    {
       if (infix[i] == '(' || infix[i] == '[' || infix[i] == '{')
           symbls.Push(infix[i]);

       if (infix[i] == ')' || infix[i] == ']' || infix[i] == '}')
          if (symbls.Count == 0)
          {
             valid = false;
             break;
          }
          else
          {
             char ch = symbls.Pop();
             switch(ch)
             {
                case '(':
                  if (')' != infix[i])
                  {
                     valid = false;
                     break;
                  }
                  break;
                case '[':
                  if (']' != infix[i])
                  {
                     valid = false;
                     break;
                  }
                  break;
                case '{':
                  if ('}' != infix[i])
                  {
                     valid = false;
                     break;
                  }
                  break;
              }
         }

         i++;
    }

    if (symbls.Count > 0)
        valid = false;

    return valid;
}

測試代碼

string infix = "{L{}[{[a]}R]{2}}";
bool validate = ValidBraces(infix);
MessageBox.Show(validate.ToString());

infix = "][";
validate = ValidBraces(infix);
MessageBox.Show(validate.ToString());

如評論中所述,您可以使用堆棧來檢查右括號是否與打開的最后一個匹配。

bool IsSequenceValid(string value)
{
    var openParenthesisStack = new Stack<char>();
    var isValid = true;

    using (var character = value.GetEnumerator())
        while (isValid && character.MoveNext())
            switch (character.Current)
            {
                case '(':
                case '[':
                case '{':
                    openParenthesisStack.Push(character.Current);
                    break;

                case ')':
                    if (openParenthesisStack.Count == 0 || openParenthesisStack.Pop() != '(')
                        isValid = false;
                    break;

                case ']':
                    if (openParenthesisStack.Count == 0 || openParenthesisStack.Pop() != '[')
                        isValid = false;
                    break;

                case '}':
                    if (openParenthesisStack.Count == 0 || openParenthesisStack.Pop() != '{')
                        isValid = false;
                    break;
            }

    return isValid && openParenthesisStack.Count == 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM