嵌套优化版括号匹配检查

       设置三个计数器初值设为零,分别记录小括号、中括号、大括号。开始进行第一次扫描,从左向右依次扫描每个字符,遇到左括号计数器加一,遇到右括号计数器减一,出现计数器小于零时,报错退出。扫描结束后,若三个计数器有一个不为零说明括号不匹配,报错结束检查。

       第一步扫描结束,如果正确说明三种括号本身匹配正确。现在可能出现的错误只可能是不同括号出现交叉,比如 {(}{)},({[)]}。

       计数器清零,现在从左向右依次扫描每个字符,直到遇到右括号,计数器加一,然后逆向扫描右括号之前的字符。遇到右括号计数器加一,遇到左括号计数器减一,直到遇到与开始处同类型的左括号,而且此类型计数器为零,如果此时其他两种括号计数器有不为零的,一定是存在交叉错误,报错结束扫描。否则计数器清零,继续向右扫描找到下一个右括号,重复上述操作直到扫描完整个字符串。

       对于嵌套括号的处理做了优化,扫描速度倍增。        

 

#define _using_goto_in_bracketsmatchingcheck_  1


/*
  参数:szsrc 为待检测字符串。
返回值:括号匹配正确 返回1值,否则返回0值。
*/
int bracketsmatchingcheck(const char *szsrc)
{
 const char *ptr = szsrc;
 const char *ptrlaststart;
 const char *ptrlastend;  
 const char *ptrnowend = NULL;  
 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;

        break;
     #endif
    }
   else if (c == ')')
    {
     if (parenthesis == 0)
      return 0;

     --parenthesis;
     #ifdef _using_goto_in_bracketsmatchingcheck_
        if ((int)(c = *ptr++))
         goto scanfir;
        
        break;
     #endif
    }   
   else if (c == '[')
    {
     ++brackets;
     #ifdef _using_goto_in_bracketsmatchingcheck_
        if ((int)(c = *ptr++))
         goto scanfir;
        
        break;
     #endif
    }
   else if (c == ']')
    {
     if (brackets == 0)
      return 0;

     --brackets;
     #ifdef _using_goto_in_bracketsmatchingcheck_
        if ((int)(c = *ptr++))
         goto scanfir;
      
        break;
     #endif
    }   
   else if (c == '{')
    {
     ++braces;
     #ifdef _using_goto_in_bracketsmatchingcheck_
        if ((int)(c = *ptr++))
         goto scanfir;
      
        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;
     ptrlastend = ptrnowend;  
     ptrnowend = ptr;  
     parenthesis = 0;
     brackets = 1;
     braces = 0;
     while(1) 
      {
       if ((c = *ptr1) == ')') 
        {
         ++parenthesis;
         --ptr1;
         continue;
        }
       else if (c == '(') 
        {
         if (parenthesis == 0)
          return 0;

         --parenthesis;
         --ptr1;
         continue;
        }
       else if (c == '[') 
        {
         if ((--brackets) == 0) 
          {
           if (parenthesis == 0 && braces == 0)
            {
             #ifdef _using_goto_in_bracketsmatchingcheck_
                if ((int)(ch = *(++ptr)))
                 {
                  ptrlaststart = ptr1;  
                  goto scansec;
                 }

                return 1;
             #else
                ptrlaststart = ptr1;  
                break;
             #endif
            }

           return 0;
          }
         --ptr1;
         continue;
        }
       else if (c == ']') 
        {
         if (ptr1 == ptrlastend)  
          {  
           (ptr1 = ptrlaststart)--;  
           continue;  
          }  

         ++brackets;  
         --ptr1;
         continue;
        }
       else if (c == '}') 
        {
         if (ptr1 == ptrlastend)  
          {  
           (ptr1 = ptrlaststart)--;  
           continue;  
          }  
         
         ++braces;  
         --ptr1;
         continue;
        }
       else if (c == '{') 
        {
         --braces;
         --ptr1;
        }
      }
    }
   else if (ch == '}')
    {
     const char *ptr1 = ptr - 1;
     ptrlastend = ptrnowend;  
     ptrnowend = ptr;  
     parenthesis = 0;
     brackets = 0;
     braces = 1;
     while(1) 
      {
       if ((c = *ptr1) == ')') 
        {
         ++parenthesis;
         --ptr1;
         continue;
        }
       else if (c == '(') 
        {
         if (parenthesis == 0)
          return 0;

         --parenthesis;
         --ptr1;
         continue;
        }
       else if (c == '{')
        {
         if ((--braces) == 0)
          {
           if (parenthesis == 0 && brackets == 0)
            {
             #ifdef _using_goto_in_bracketsmatchingcheck_
                if ((int)(ch = *(++ptr)))
                 {
                  ptrlaststart = ptr1;  
                  goto scansec;
                 } 
                
                return 1;
             #else
                ptrlaststart = ptr1;  
                break;
             #endif
            }

           return 0;
          }
         --ptr1;
         continue;
        }
       else if (c == '}')
        {
         if (ptr1 == ptrlastend)  
          {  
           (ptr1 = ptrlaststart)--;  
           continue;  
          }  

         ++braces;  
         --ptr1;
         continue;
        }
       else if (c == ']')
        {
         if (ptr1 == ptrlastend)  
          {  
           (ptr1 = ptrlaststart)--;  
           continue;  
          }  

         ++brackets;  
         --ptr1;
         continue;
        }
       else if (c == '[')
        {
         --brackets;
         --ptr1;
        }
      }
    }
  
   ++ptr;
  }

 return 1;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值