题目![](https://img-blog.csdnimg.cn/direct/b1b1625954d0426b809f514bba9613f8.png)
解题思路:
需要我们判断括号两边是不是相等,但括号不匹配的情况有很多种。比如说左边的大括号与右边的中括号就是不匹配。但是我们可以直接可以用数学思想里面的正难则反去判断
步骤
1:可以用栈来解决,
我们先初始化,但是我们在说话之前要先判断一下他传过来的是不是空指针
2:然后我们再用循环的方法,
如果是左括号就进如果是右括号的话,就要分几种情况看1.如果进优酷号直接是空的话,我们直接就是判他错返回false2.如果是不是空的话,看他括号两边是不是匹配,如果匹配的话就出栈,如果不匹配的话就留在栈里。我们最后会判断,当然,如果说不匹配的话,直接就判错,然后给他返回false
答案:如下
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top; // 栈顶
int capacity; // 容量
}ST;
bool STEmpty(ST* pst)
{
assert(pst);
return pst->top == 0;
}
void STDestroy(ST* pst)
{
assert(pst);
free(pst->a);
pst->a = NULL;
pst->top = pst->capacity = 0;
}
void STInit(ST* pst)
{
assert(pst);
pst->a = NULL;
// top指向栈顶数据的下一个位置
pst->top = 0;
// top指向栈顶数据
//pst->top = -1;
pst->capacity = 0;
}
void STPop(ST* pst)
{
assert(pst);
assert(pst->top > 0);
pst->top--;
}
void STPush(ST* pst, STDataType x)
{
assert(pst);
if (pst->capacity == pst->top)
{
int newcapacity = pst->capacity == 0 ? 4 : 2 * pst->capacity;
STDataType* tmp = (STDataType*)realloc(pst->a, newcapacity * sizeof(STDataType));
if (tmp == NULL)
{
perror("creat fail");
return;
}
pst->a = tmp;
pst->capacity = newcapacity;
}
pst->a[pst->top] = x;
pst->top++;
}
STDataType STTop(ST* pst)
{
assert(pst);
assert(pst->top > 0);
return pst->a[pst->top - 1];
}
bool isValid(char* s) {
assert(s);
ST st;
STInit(&st);
while (*s)
{
if (*s == '(' || *s == '[' || *s == '{')
STPush(&st, *s);
else
{
if (STEmpty(&st))
{
STDestroy(&st);
return false;
}
char top = STTop(&st);
if (top == '(' && *s == ')' || top == '[' && *s == ']' || top == '{' && *s == '}')
{
STPop(&st);
}
else {
STDestroy(&st);
return false;
}
}
s++;
}
bool ret = STEmpty(&st);
STDestroy(&st);
return ret;
}