借助于栈实现:
方法(1):依次读取每个字符,如果是左括号就入栈,如果是右括号,看栈顶是否是对应的左括号,是的话弹出栈顶元素,代表一对括号匹配完毕,再判断下一个字符。不是的话,说明匹配失败。最后记得要判断栈为空才匹配成功,防止左括号个数与右括号个数不一致。
方法(2):与方法1思想一致,只是方法二的扩展性较好,假如增加其它的括号(如<、>)等。
方法一代码:(如果是C语言中,前提是你已经实现好了栈数据结构Stack)
int IsValid(char* str)//匹配返回1,否则返回0
{
assert(str);
Stack s;
StackInit(&s, 10);
while (*str)
{
if ((*str == '(') || (*str == '[') || (*str == '{'))//当遇到的字符是"左括号",就入栈
{
StackPush(&s,*str);
}
else//不是左括号(那就看是哪一种右括号,或者哪一种右括号也不是)
{
char top = StackTop(&s);
if (*str == ')')//右括号')'
{
if (top == '(')
{
return 1;
}
else
{
return 0;
}
}
else if (*str == ']')//右括号']'
{
if (top == '[')
{
return 1;
}
else
{
return 0;
}
}
else if (*str == '}')//右括号'}'
{
if (top == '{')
{
return 1;
}
else
{
return 0;
}
}
else//不是这三种右括号,直接返回不匹配
{
return 0;
}
}
str++;//看下一个字符
}
//一个一个字符判断完之后,看栈是不是为空
if (StackEmpty(&s) == 0)
{
return 1;
}
else
{
return 0;
}
}
方法二代码:
int IsValid(char* str)//匹配返回1,否则返回0
{
assert(str);
Stack s;
StackInit(&s, 10);
char symbol[][2] = {
{'(', ')'},
{'[', ']'},
{'{', '}'}
};
while (*str)
{
int i = 0;
for (i = 0; i < sizeof(symbol) / sizeof(symbol[0]); i++)
{
if (*str == symbol[i][0])//只要这个字符是左括号,入栈,直接判断下一个字符
{
StackPush(&s, *str);
str++;
break;
}
}
//来到这有两种可能,break跳出来说明*str是左括号,那就直接判断下一个字符,即不执行下面代码。如果是for循环跳出来的,说明*str不是左括号,则要进行以下的代码
if (i == sizeof(symbol) / sizeof(symbol[0]))
{
char top = StackTop(&s);
for (int i = 0; i < sizeof(symbol) / sizeof(symbol[0]); i++)
{
if (*str == symbol[i][1])//只要这个字符是右括号,将栈顶元素与这个右括号对应的左括号比较
{
if (top == symbol[i][0])
{
StackPop(&s);//出栈
str++;//看下一个字符
break;
}
else
{
return 0;
}
}
}
}
}
if (StackEmpty(&s) == 0)
{
return 1;
}
else
{
return 0;
}
}