题目
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
只有单括号也判定为false
利用栈的先进后出来实现
typedef char STDataType;
typedef struct Stack{
STDataType* a;
int top;
int capacity;
}ST;
void StackIntt(ST* ps){
ps->capacity=0;
ps->a=NULL;
ps->top=0;
}
void StackPush(ST* ps,STDataType x){
if(ps->capacity==ps->top){
//初始分配大小为4的栈,如果栈满则重新分配大小为原大小两倍的栈
int newCapacity=ps->capacity==0?4:ps->capacity*2;
STDataType* tmp=realloc(ps->a,newCapacity*sizeof(STDataType));
if(tmp==NULL){
printf("realloc fail\n");
}
ps->capacity=newCapacity;
ps->a=tmp;
}
ps->a[ps->top]=x;
ps->top++;
}
void StackPop(ST* ps){
ps->top--;
}
void StackDestory(ST* ps){
free(ps->a);
ps->a=NULL;
ps->capacity=0;
ps->top=0;
}
STDataType StackTop(ST* ps){
return ps->a[ps->top-1];
}
int StackSize(ST* ps){
return ps->top;
}
int StackEmpty(ST* ps){
return ps->top==0;
}
bool isValid(char * s){
ST st;
StackIntt(&st);
while(*s){
if((*s=='[')||(*s=='(')||(*s=='{')){
StackPush(&st,*s);
s++;
}else{
if(StackEmpty(&st)){
return false;//只剩下右括号,没有左括号来匹配
}
STDataType top=StackTop(&st);
StackPop(&st);
if((*s == ']' && top != '[')
|| (*s == '}' && top != '{')
|| (*s == ')' && top != '('))
{
StackDestory(&st);
return false;
}else{
++s;
}
}
}
if(!StackEmpty(&st)){
return false;//匹配完了还有左括号,没有右括号来匹配
}
StackDestory(&st);
return true;
}