一:题目
二:思路讲解
1:先把该函数需要的栈的函数放在前面。
该问题的前提是得有栈的实现为前提,博主链接栈的实现(一篇包懂)-CSDN博客 已经详细讲解了栈的实现。
需要的栈的代码:
typedef char STDataType;
typedef struct Stack {
STDataType* a;
int top;
int capacity;
} ST;
void STInit(ST* ps) {
assert(ps);
ps->a = NULL;
ps->capacity = 0;
ps->top = 0;
}
// 销毁栈
void STDestroy(ST* ps) {
assert(ps);
free(ps->a);
ps->a = NULL;
ps->capacity = 0;
ps->top = 0;
}
// 入栈函数
void STPush(ST* ps, int x) {
assert(ps);
if (ps->capacity == ps->top) {
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
STDataType* tmp =
(STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);
if (tmp == NULL) {
perror("realloc fales");
exit(-1);
}
ps->a = tmp;
ps->capacity = newcapacity;
}
ps->a[ps->top] = x;
ps->top++;
}
// 出栈函数
void STPop(ST* ps) {
assert(ps);
assert(ps->top > 0);
ps->top--;
}
// 返回栈顶元素
STDataType STTop(ST* ps) {
assert(ps);
assert(ps->top > 0);
return ps->a[ps->top - 1];
}
// 获取栈中元素个数
int STSize(ST* ps) {
assert(ps);
return ps->top;
}
// 检测栈是否为空
bool STEmpty(ST* ps) {
assert(ps);
return ps->top == 0;
}
2:逢左括号入栈,逢右括号出栈
解释:因为栈是后进先出,所以当你把左括号都入栈的时候,这个时候,当你遇到一个右括号,这个右括号一定是和最后入的左括号是匹配的(ture的情况下),然后你就出栈左括号,然后看这左右括号是否匹配 即可。
3:false的情况
解释:
a:顺序不匹配,如③
b:数量不匹配,① 和②都是数量不匹配
三:代码
bool isValid(char* s) {
ST st;
STInit(&st);
//*s不为\0则继续(\0的ascll码值是0)
while (*s) {
//遇到左括号就入栈
if (*s == '[' || *s == '{' || *s == '(') {
STPush(&st, *s);
}
else //右括号进入else
{
//此时想要出栈一个左括号,检测是否匹配
//但是栈为空,则数量不匹配,false
if (STEmpty(&st))
{
STDestroy(&st);
return false;
}
else//栈不为空,则出栈检测匹配
{
//出栈括号放进top
char top = STTop(&st);
//记得删除
STPop(&st);
//[] () {} 都不匹配,则false
if (*s == ']' && top != '[' || *s == '}' && top != '{' ||
*s == ')' && top != '(') {
STDestroy(&st);
return false;
}
}
}
//来到这里,代表前面匹配成功
//则对下一个括号,进行判断
s++;
}
//得到检测栈空的bool值
//栈空代表 全部匹配成功
//栈不为空代表数量不匹配(有多余的左括号)
bool ret = STEmpty(&st);
STDestroy(&st);
//返回bool值
return ret;
}