题目描述
思路
这道题可以用栈的方法,先进后出,在栈内存储一个括号,再将栈内数据和字符比较,判断错误还是正确
解题方法
第一步:实现栈
第二步:将字符存入栈内
第三步:将栈内数据和下一个字符比较,判断括号是否匹配
第四步:清空栈内数据,继续比较
代码实现
typedef int STDateType;
typedef struct Stack
{
STDateType* _a;
int _top;//栈顶下标
int _capacity;
}Stack;
//初始化数据
void StackInit(Stack* pst);
//销毁数据
void StackDestory(Stack* pst);
//入栈
void StackPush(Stack* pst, STDateType x);
//出栈
void StackPop(Stack* pst);
//获取栈内数据个数
int StackSize(Stack* pst);
//返回1是空,返回0是非空
int StackEmpty(Stack* pst);
//获取栈顶数据
STDateType StackTop(Stack* pst);
//初始化数据
void StackInit(Stack* pst)
{
assert(pst);
pst->_a = (STDateType*)malloc(sizeof(STDateType) * 4);
pst->_top = 0;
pst->_capacity = 4;
}
//销毁数据
void StackDestory(Stack* pst)
{
assert(pst);
free(pst->_a);
pst->_a = NULL;
pst->_top = pst->_capacity = 0;
}
//入栈
void StackPush(Stack* pst, STDateType x)
{
assert(pst);
if (pst->_top == pst->_capacity)
{
pst->_capacity *= 2;
STDateType* tmp = (STDateType*)realloc(pst->_a, sizeof(STDateType) * (pst->_capacity));
if (tmp==NULL)
{
printf("内存不足\n");
exit(-1);
}
else
{
pst->_a = tmp;
}
}
pst->_a[pst->_top] = x;
pst->_top++;
}
//出栈
void StackPop(Stack* pst)
{
assert(pst);
assert(pst->_top > 0);
pst->_top--;
}
//获取栈内数据个数
int StackSize(Stack* pst)
{
assert(pst);
return pst->_top;
}
//返回1是空,返回0是非空
int StackEmpty(Stack * pst)
{
assert(pst);
/*return pst->_top ==0 ? 1 : 0;*/
return !pst->_top;
}
//获取栈顶数据
STDateType StackTop(Stack* pst)
{
assert(pst);
assert(pst->_top > 0);
return pst->_a[pst->_top - 1];
}
//以下是正式解答
bool isValid(char* s) {
Stack st;
StackInit(&st);//初始化数据
bool ret;
while(*s)
{
if(*s=='('||*s=='{'||*s=='[')//判断字符是否为前括号
{
StackPush(&st,*s);//如果是前括号则入栈
s++;
}
else
{
if(StackEmpty(&st))//如果只有一个括号的情况
{
ret=false;
break;
}
char top=StackTop(&st);//将栈顶数据记录
//比较栈内的括号和字符是否匹配,不匹配则退出
if(*s==')'&& top!='(')
{
ret=false;
break;
}
if(*s=='}'&& top!='{')
{
ret=false;
break;
}
if(*s==']'&& top!='[')
{
ret=false;
break;
}
StackPop(&st);//将栈内数据排出
s++;
}
}
if(*s=='\0')//如果字符为空时,判断站内数据
{
ret=StackEmpty(&st);
}
StackDestory(&st);//销毁数据,否则会出现内存泄漏
return ret;
}