要处理的表达式可以包含三种不同类型的括号:(),{} , []
eg.
(((((()))))) – VALID
()()()() – VALID
(((((((() – INVALID
((()(()))) – VALID
算法:
1.初始化栈 S。
2.一次处理表达式的每个括号。
3.如果遇到开括号,我们只需将其推到栈上即可。这意味着我们将稍后处理它,让我们简单地转到前面的子表达式。
4.如果我们遇到一个闭括号,那么我们检查栈顶的元素。如果栈顶的元素是一个相同类型的左括号,那么我们将它从栈中弹出并继续处理。否则,这意味着表达式无效。
5.如果到最后我们剩下的栈中仍然有元素,那么这意味着表达式无效。
bool isValid(char* s) {
if( s == NULL )
return false;
char *stack = (char *) malloc( sizeof(char) * ( strlen(s)+1 ) );
int top = 0;
for( int i = 0; s[i] != '\0'; i++)
{
if(s[i] == '(' || s[i]=='[' || s[i]=='{') //左括号入栈
stack[++top] = s[i]; //top = top + 1
else if( (s[i]==')'&&stack[top]=='(') ||
(s[i]==']'&&stack[top]=='[') ||
(s[i]=='}'&&stack[top]=='{') ) //右括号比对
top--;
else //比对失败
return false;
}
///删掉可以通过编译
if( stack != NULL)
{
free(stack);
stack = NULL;
}
///删掉可以通过编译
if(top == 0) //字符串结束且栈空
return true;
return false;
}