第一步掃描結束,如果正確說明三種括號本身匹配正確。現在可能出現的錯誤只可能是不同括號出現交叉,比如 {(}{)},({[)]}。
計數器清零,現在從左向右依次掃描每個字符,直到遇到右括號,計數器加一,然後逆向掃描右括號之前的字符。遇到右括號計數器加一,遇到左括號計數器減一,直到遇到與開始處同類型的左括號,而且此類型計數器爲零,如果此時其他兩種括號計數器有不爲零的,一定是存在交叉錯誤,報錯結束掃描。否則計數器清零,繼續向右掃描找到下一個右括號,重複上述操作直到掃描完整個字符串。
#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;
}