作者:小树苗渴望变成参天大树
作者宣言:认真写好每一篇博客
作者gitee:gitee
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!
文章目录
- 前言
前言
今天我们再来讲一期关于题目的博客,我挑选的是一道leetcode上面的一道题,这道题目说起来也不是特别难,我们将使用栈的性质来解决这道题,让我们一起来解决这道题
我们通过题目可以发现我们有三种括号,上面举的例子不多
//成功匹配的例子:
{([{}])}()[]
//不成功匹配的例子:
[
)
[[]}
我们通过栈来实现这个题目,所有的左括号入栈,右括号就匹配
最后结束后栈空就匹配成功
我们首先需要有一个栈
typedef char STDataType;
struct Stack
{
STDataType* a;
int top;
int capacity;
};
typedef struct Stack ST;
void StackInit(ST* ps)
{
assert(ps);
ps->a = (STDataType*)malloc(sizeof(STDataType)*4);
if (ps->a == NULL)
{
printf("malloc fail\n");
exit(-1);
}
ps->top = 0;//为0的话,top指向的是栈顶的下一个元素,如果为-1;就指向栈顶元素
ps->capacity = 4;
}
void StackDestory(ST* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->capacity=ps->top=0;
}
void StackPush(ST* ps, STDataType x)
{
assert(ps);
if (ps->top == ps->capacity)
{
STDataType* tmp = (STDataType*)realloc(ps->a, ps->capacity * 2 * sizeof(STDataType));
if (tmp == NULL)
{
printf("realloc fail\n");
exit(-1);
}
else
{
ps->a = tmp;
ps->capacity *= 2;
}
}
ps->a[ps->top] = x;
ps->top++;
}
void StackPop(ST* ps)
{
assert(ps);
assert(ps->top > 0);//断言栈里是否有元素
ps->top--;
}
STDataType StackTop(ST* ps)//返回栈顶的元素
{
assert(ps);
assert(ps->top > 0);
return ps->a[ps->top - 1];
}
int StackSize(ST* ps)//返回栈里有多少个元素
{
assert(ps);
return ps->top;
}
bool StackEmpty(ST* ps)
{
assert(ps);
return ps->top == 0;
}
不会的可以在我写的关于栈的那篇博客中去学学
我们来看看代码:
bool isValid(char * s){
ST st;
StackInit(&st);
while(*s)
{
if(*s=='('||*s=='{'||*s=='[')
{
StackPush(&st,*s);
}
else
{
if(StackEmpty(&st))
{
StackDestory(&st);
return false;
}
else
{
char top=StackTop(&st);
StackPop(&st);
if(*s==')'&&top!='('||
*s=='}'&&top!='{'||
*s==']'&&top!='[')
{
return false;
}
}
}
s++;
}
bool ret=StackEmpty(&st);
if(ret)
{
return true;
}
return false;
}
说明:
大家可以以走读代码的方式举个例子来看看,然后再试着自己来完成这个代码,首先你得有一个栈,顺便把栈的知识也学学,我们今天就讲到这里了,我们下期再见