给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
也就是说当第一个左括号出现时,离它最近的那个右括号一定是要与之相匹配的
解题思路——遍历字符串——遇到右括号把右括号放到栈中,遇到左括号就去与栈顶元素相匹配,如果不匹配就返回false,匹配的话就把栈顶元素出栈继续遍历循环匹配下一组
代码:
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef char SltDatatype;
typedef struct Stack
{
SltDatatype* a;//开辟栈的动态内存空间
int top;//记录栈顶
int capacity;//记录容量
}ST;
void STInit(ST* ps)//栈的初始化
{
assert(ps);
ps->a = NULL;
ps->capacity = 0;
ps->top = 0;
}
void STPush(ST* ps,SltDatatype x)//入栈
{
assert(ps);
if (ps->top == ps->capacity)
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//因为初始化是capacity是0,所有这里需要,如果capacity是0的话,*2也是0,所有要在这里先给他一个值4
//扩容
SltDatatype * tmp= (SltDatatype*)realloc(ps->a, sizeof(SltDatatype) * newcapacity);
if (tmp == NULL)
{
perror("realloc fail");
exit(-1);
}
ps -> a = tmp;
ps->capacity = newcapacity;
}
ps->a[ps->top] = x;
ps->top++;
}
void STDestroy(ST* ps)//释放
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->capacity = 0;
ps->top = 0;
}
void STPop(ST* ps)//出栈
{
assert(ps);
assert(ps->top>0);//空
ps->top--;
}
SltDatatype STTop(ST* ps)//获取栈顶原数
{
assert(ps);
assert(ps->top > 0);
return ps->a[ps->top - 1];
}
int Size(ST* ps)//求栈的长度
{
assert(ps);
return ps->top;
}
bool STEmpty(ST* ps)//空
{
assert(ps);
return ps->top == 0;
}
bool isValid(char * s){
ST st;
STInit(&st);
char topVal;
while(*s)
{
if(*s=='{'||*s=='('||*s=='[')
{
//入栈
STPush(&st,*s);
}else
{
if(STEmpty(&st))
{
STDestroy(&st);
return false;
}
topVal=STTop(&st);
STPop(&st);
if((*s==']'&&topVal!='[')
||(*s=='}'&&topVal!='{')
||(*s==')'&&topVal!='('))
{
STDestroy(&st);
return false;
}
}
s++;
}
//栈不为空,flase,说明数量不匹配
// bool ret=STEmpty(&st);
// STDestroy(&st);
// return ret;
if(STEmpty(&st))
{
return true;
}else
{
return false;
}
}