题目描述:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}" 输出: true
提交代码思路:使用栈的思想,遇到反括号时,判断是否与栈顶元素配对即可。
bool isValid(char* s) {
if(s==NULL || strcmp(s,"")==0)
{
printf("0.s=%s\n",s);
return true;
}
int len=strlen(s);
/*
char *tmp=s;
int len=0;
while(*tmp!='\0')
{
tmp++;
len++;
}
*/
char *stack=(char *)malloc(sizeof(char)*len);
memset(stack,0,sizeof(char)*len);
int pos=0;
if(*s==')' || *s==']' || *s=='}')
{
printf("1.*s=%c\n",*s);
free(stack);
return false;
}
stack[pos++]=*s;
printf("2.stack=%s\n",stack);
s++;
while(*s!='\0')
{
printf("*s=%c,",*s);
if(*s==')' || *s==']' || *s=='}')
{
if(pos>0 &&((*s==')'&&stack[pos-1]=='(')||(*s==']'&&stack[pos-1]=='[')||(*s=='}'&&stack[pos-1]=='{')))
{
pos--;
}
else
{
free(stack);
return false;
}
}
else
{
stack[pos++]=*s;
}
s++;
}
free(stack);
printf("pos=%d\n",pos);
if(pos==0)
{
return true;
}
return false;
}