不用棧檢查小括號、中括號、大括號的匹配

       設置三個計數器初值設爲零,分別記錄小括號、中括號、大括號。開始進行第一次掃描,從左向右依次掃描每個字符,遇到左括號計數器加一,遇到右括號計數器減一,出現計數器小於零時,報錯退出。掃描結束後,若三個計數器有一個不爲零說明括號不匹配,報錯結束檢查。

       第一步掃描結束,如果正確說明三種括號本身匹配正確。現在可能出現的錯誤只可能是不同括號出現交叉,比如 {(}{)},({[)]}。

       計數器清零,現在從左向右依次掃描每個字符,直到遇到右括號,計數器加一,然後逆向掃描右括號之前的字符。遇到右括號計數器加一,遇到左括號計數器減一,直到遇到與開始處同類型的左括號,而且此類型計數器爲零,如果此時其他兩種括號計數器有不爲零的,一定是存在交叉錯誤,報錯結束掃描。否則計數器清零,繼續向右掃描找到下一個右括號,重複上述操作直到掃描完整個字符串。

 

#define _using_goto_in_bracketsmatchingcheck_  1


/*
  參數:szsrc 爲待檢測字符串。
返回值:括號匹配正確 返回1值,否則返回0值。
*/
int bracketsmatchingcheck(const char *szsrc)
{
 const char *ptr = szsrc;
 char c;
 char ch;
 long parenthesis = 0; /* ()計數器 */
 long brackets = 0;    /* []計數器 */
 long braces = 0;      /* {}計數器 */

 if (szsrc == NULL)
  return 1;

 while((int)(c = *ptr++)) /* 第一次掃描 */
  {
   scanfir:
   if (c == '(')
    {
     ++parenthesis;
     #ifdef _using_goto_in_bracketsmatchingcheck_
        if ((int)(c = *ptr++))
         goto scanfir;
        else
         break;
     #endif
    }
   else if (c == ')')
    {
     if (parenthesis == 0)
      return 0;
     --parenthesis;
     #ifdef _using_goto_in_bracketsmatchingcheck_
        if ((int)(c = *ptr++))
         goto scanfir;
        else
         break;
     #endif
    }   
   else if (c == '[')
    {
     ++brackets;
     #ifdef _using_goto_in_bracketsmatchingcheck_
        if ((int)(c = *ptr++))
         goto scanfir;
        else
         break;
     #endif
    }
   else if (c == ']')
    {
     if (brackets == 0)
      return 0;
     --brackets;
     #ifdef _using_goto_in_bracketsmatchingcheck_
        if ((int)(c = *ptr++))
         goto scanfir;
        else
         break;
     #endif
    }   
   else if (c == '{')
    {
     ++braces;
     #ifdef _using_goto_in_bracketsmatchingcheck_
        if ((int)(c = *ptr++))
         goto scanfir;
        else
         break;
     #endif
    }
   else if (c == '}')
    {
     if (braces == 0)
      return 0;
     --braces;
    }   
  }

 if (parenthesis != 0 || brackets != 0 || braces != 0) /* 括號不匹配,退出 */
  return 0;

 ptr = szsrc;
 while((int)(ch = *ptr)) /* 第二次掃描 */
  {
   scansec:
   if (ch == ']')
    {
     const char *ptr1 = ptr - 1;
     parenthesis = 0;
     brackets = 1;
     braces = 0;
     while(1) 
      {
       if ((c = *ptr1--) == '[') 
        {
         if ((--brackets) == 0) 
          {
           if (parenthesis == 0 && braces == 0)
            {
             #ifdef _using_goto_in_bracketsmatchingcheck_
                if ((int)(ch = *(++ptr)))
                 goto scansec;
                else
                 return 1;
             #else
                break;
             #endif
            }
           else
            return 0;
          }
        }
       else if (c == ']') 
        ++brackets;
       else if (c == ')') 
        ++parenthesis;
       else if (c == '(') 
        {
         if (parenthesis == 0)
          return 0;
         --parenthesis;
        }
       else if (c == '}') 
        ++braces;
       else if (c == '{') 
        --braces;
      }
    }
   else if (ch == '}')
    {
     const char *ptr1 = ptr - 1;
     parenthesis = 0;
     brackets = 0;
     braces = 1;
     while(1) 
      {
       if ((c = *ptr1--) == '{')
        {
         if ((--braces) == 0)
          {
           if (parenthesis == 0 && brackets == 0)
            {
             #ifdef _using_goto_in_bracketsmatchingcheck_
                if ((int)(ch = *(++ptr)))
                 goto scansec;
                else
                 return 1;
             #else
                break;
             #endif
            }
           else
            return 0;
          }
        }
       else if (c == '}')
        ++braces;
       else if (c == ')') 
        ++parenthesis;
       else if (c == '(') 
        {
         if (parenthesis == 0)
          return 0;
         --parenthesis;
        }
       else if (c == ']')
        ++brackets;
       else if (c == '[')
        --brackets;
      }
    }
  
   ++ptr;
  }

 return 1;
}


發佈了29 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章