括号匹配问题:给你一串字符串,判断其中的括号是否匹配,如下几种情况:
(1) adaf[jskdf]jjkl(121)mksfsdl{} 匹配
(2) nkdksl(djlk[12njs{232332jn}]) 匹配
(3) 6237[jjsfj(kk222]jn23d) 不匹配
(4) ]121ndsfs[jfksfs 不匹配
该算法的主要思想是,从左至右扫描整个字符串,当遇到左括号如[、(、{等时,将其进栈,当遇到右括号时,如]、)、}时,判断栈顶元素是否与其相对应的左括号匹配,如匹配,则删除栈顶元素,继续扫描下一个字符。最后,当所有元素都扫描完后,如果栈为空,则匹配,否则不匹配。
注意的是,在扫描时当遇到右括号时,当栈为空或者栈顶元素与其不匹配时,则可以返回,该串一定是括号不匹配的。
算法代码如下:
#include <stdio.h>
#define MAXSIZE 100
typedef struct tagstack
{
char data[MAXSIZE];
int top;
}stack;
int ParenthesisMatch(char *str)
{
stack s;
s.top = -1;
int i = 0;
while (str[i]!='\0')
{
switch (str[i])
{
case '(':
case '[':
case '{':
{
s.top ++;
s.data[s.top] = str[i];
break;
}
case ')':
{
if (s.top!=-1&&s.data[s.top]=='(')
{
s.top --;
}
else //s.top==-1说明第一个就是反括号
{
return 0;
}
break;
}
case ']':
{
if (s.top!=-1&&s.data[s.top]=='[')
{
s.top --;
}
else
{
return 0;
}
break;
}
case '}':
{
if (s.top!=-1&&s.data[s.top]=='{')
{
s.top --;
}
else
{
return 0;
}
break;
}
}
i++;
}
if (s.top==-1)
{
return 1;
}
else
{
return 0;
}
}
void main(void)
{
char str[]="{d(f[11)c]c}";
if (ParenthesisMatch(str)==1)
{
printf("Match!\n");
}
else if (ParenthesisMatch(str)==0)
{
printf("Not Match!\n");
}
}