链接在这 ---- leetcode - 20
这道题首先肯定是用栈解决
然而C语言解题的话,就没有现成的栈结构可用,那怎么办呢,那就自己实现一个栈
这里是源码
typedef char STDataType;
typedef struct Stack
{
STDataType* a;
int top;
int capacity;
}ST;
void StackInit(ST* ps)
{
assert(ps);
ps->capacity = 0;
ps->a = NULL;
ps->top = 0;
}
void StackPush(ST* ps, STDataType x)
{
assert(ps);
if (ps->capacity == ps->top)
{
int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
STDataType* tmp = realloc(ps->a, newCapacity * sizeof(STDataType));
if (tmp == NULL)
{
printf("realloc fail\n");
exit(-1);
}
ps->capacity = newCapacity;
ps->a = tmp;
}
ps->a[ps->top] = x;
ps->top++;
}
void StackPop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
ps->top--;
}
void StackDesroy(ST* ps)
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->capacity = 0;
ps->top = 0;
}
STDataType StackTop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
return ps->a[ps->top - 1];
}
int StackSize(ST* ps)
{
assert(ps);
return ps->top;
}
int StackEmpty(ST* ps)
{
assert(ps);
return ps->top == 0;
}
解题思路
然后就是我们的解题思路了
首先我们向前把括号的字符串Push
到栈中
然后直到我们没有遇到左括号就拿 栈顶 元素和Push
到的最后一个元素进行比较
如果都不是对应的括号的话,就可以返回 false
了。
如果全都匹配就返回true
于是我们就可以写出以下代码 :
bool isValid(char * s)
{
ST st;
StackInit(&st);
while(*s)
{
if((*s == '[')
|| (*s == '(')
|| (*s == '{'))
{
StackPush(&st,*s);
s++;
}
else
{
STDataType top = StackTop(&st);
StackPop(&st);
if((*s == ']' && top != '[')
|| (*s == '}' && top != '{')
|| (*s == ')' && top != '('))
{
StackDesroy(&st);
return false;
}
else
{
++s;
}
}
}
StackDesroy(&st);
return true;
但是如果我们直接提交代码,会发现一些错误.
特殊用例
然而还有一些特殊情况 例如只有左括号或者只有右括号
- 只有一个左括号的情况:
我们循环结束的时候没有考虑到还剩下元素的情况 (这个时候当然只可能有左括号)。 - 只有一个右括号的情况:
我们发现没有没有左括号,所以我们进入下一步,这时需要检验,有没有左括号可以匹配,如果没有那也可以直接返回辣。
所以我们要在两个地方加上一些细节
代码如下
这里是题解
bool isValid(char * s)
{
ST st;
StackInit(&st);
while(*s)
{
if((*s == '[')
|| (*s == '(')
|| (*s == '{'))
{
StackPush(&st,*s);
s++;
}
else
{
//判断栈是否为空,如果为空,就意思是没有左括号可以匹配 ----- 测试用例 "]"
//如果不为空,就可以进入下一步
if(StackEmpty(&st))
{
return false;
}
STDataType top = StackTop(&st);
StackPop(&st);
if((*s == ']' && top != '[')
|| (*s == '}' && top != '{')
|| (*s == ')' && top != '('))
{
StackDesroy(&st);
return false;
}
else
{
++s;
}
}
}
//判断是否为空,判断是否还有左括号. ----- 测试用例 "["
//如果还有左括号,那么就返回false
if(!StackEmpty(&st))
{
return false;
}
StackDesroy(&st);
return true;
答应我不要白piao好吗?