很久没有看数据结构和算法相关的内容了,今天偶然看到有人问这个问题,就使用C写了一段代码,实现括号匹配。该程序修改下,可以设计成通用的字符串匹配函数。具体看个人是怎么设计的。
偶尔确实需要练练手,不然一些方法真很容易忘记。编写的代码如下。
using namespace std;
//假定bracketsStr只包含大 中 小括号
BOOL BracketsIsMatch(char *bracketsStr,int *noMatchIndex)
{
if(!bracketsStr)
{
*noMatchIndex = -1;
return TRUE;
}
stack<char> bracketStack;
int len = strlen(bracketsStr);
for(int i=0;i<len;i++)
{
//左括号,入栈
if('(' == bracketsStr[i] || '[' == bracketsStr[i] || '{' == bracketsStr[i])
{
bracketStack.push(bracketsStr[i]);
continue;
}
//右括号,栈为空,不匹配
if(bracketStack.empty())
{
*noMatchIndex = i;
return FALSE;
}
//右括号,栈顶出栈
char topBracket = bracketStack.top();
bracketStack.pop();
if( ('(' == topBracket && ')' == bracketsStr[i]) ||
('[' == topBracket && ']' == bracketsStr[i]) ||
('{' == topBracket && '}' == bracketsStr[i]) )
{
continue;
}
*noMatchIndex = i;
return FALSE;
}
if(!bracketStack.empty())
{
*noMatchIndex = len-1;
return FALSE;
}
*noMatchIndex = -1;
return TRUE;
}
int main(int argc,char *argv[])
{
int noMatchIndex = 0;
char *p = "()(){[(]}";
if(!BracketsIsMatch(p,&noMatchIndex) && noMatchIndex != -1)
{
printf("No Match,index = %d,char = %c\r\n",noMatchIndex,*(p+noMatchIndex));
}
else
{
printf("Match ... \r\n");
}
return 0;
}