目录
题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
解题思路:
我们这里运用栈的先进后出思维,我们设置一个栈,只要遇到了左括号,就入栈,遇到右括号就出栈,看出栈的右括号是否和左括号匹配
入栈情况:
出栈情况:
这里先列出总代码,然后后面写出图解:
总代码:
typedef char STDataType;//直接定义char也可以,这里方便日后修改
typedef struct Stack{//创立栈
STDataType* arr;
int top;
int capacity;
}ST;
void StackListInit(ST* st)//初始化栈
{
st->arr=NULL;
st->top=0;
st->capacity=0;
}
void StackPop(ST* ps)
{
assert(ps);
--ps->top;
}
bool StackEmpty(ST* ps)//检查栈是否为空
{
assert(ps);
return ps->top == 0;
}
STDataType StackListtop(ST* st)//返回栈顶保存的数据
{
assert(st);
return st->arr[st->top-1];
}
void StackPush(ST* st,STDataType x)//入栈,扩容
{
if (st->top == st->capacity)
{
int newcapacity = st->capacity == 0 ? 4 : st->capacity * 2;
STDataType* tmp = realloc(st->arr, sizeof(STDataType)*newcapacity);
if (tmp == NULL)
{
printf("rellaoc fail\n");
exit(-1);
}
st->arr = tmp;
st->capacity = newcapacity;
}
st->arr[st->top]=x;
st->top++;
}
bool isValid(char * s){
ST st;
StackListInit(&st);
while(*s)
{
if(*s=='{'||*s=='['||*s=='(')
{
StackPush(&st,*s);
s++;
}
else
{
if(StackEmpty(&st))//判断是否只剩下右括号
{
return false;
}
char ch=StackListtop(&st);
StackPop(&st);
if((*s == ']' && ch != '[')
|| (*s == '}' && ch != '{')
|| (*s == ')' && ch != '('))
{
return false;
}
else
{
s++;
}
}
}
bool ret=StackEmpty(&st);//判断是否只剩下左括号
return ret;
}
图解: