题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
链接:link
解题思路
用栈来解决该问题非常合适,当输入为左括号时进行入栈操作,当输入为右括号时出栈,用右括号与出栈的左括号相匹配,若匹配成功则继续输入,检查是否匹配,若一直匹配则一直出栈到栈空为止,并返回ture;若不匹配则返回flase结束程序。
由于C语言没有栈容器所以自写了一个栈。分别实现栈的初始化、入栈、出栈、输出栈顶数据、输出栈的大小、栈空、摧毁栈等功能
解题代码
typedef char SDataType;
typedef struct Stack
{
SDataType* data;
int capacity;
int top;
}ST;
//栈的初始化
void StackInit(ST* ps)
{
ps->data = (SDataType*)malloc(sizeof(SDataType*) * 4);
if (ps->data == NULL)
{
printf("malloc fail\n");
exit(-1);
}
ps->capacity = 4;
ps->top = 0;//初始化给0top指向的是栈顶元素的下一个
//给-1则指向栈顶
}
//摧毁栈
void StackDestory(ST* ps)
{
assert(ps);
free(ps->data);
ps->data = NULL;
ps->top = ps->capacity = 0;
}
//栈顶插入删除数据
//入栈
void StackPush(ST* ps,SDataType x)
{
assert(ps);
if (ps->capacity == ps->top)
{
SDataType* newps = (SDataType*)realloc(ps->data,sizeof(SDataType*) * 2 * ps->capacity);
if (newps == NULL)
{
printf("realloc fail\n");
return;
}
else
{
ps->data = newps;
ps->capacity = 2 * ps->capacity;
}
}
ps->data[ps->top] = x;
ps->top++;
}
//出栈
void StackPop(ST* ps)
{
assert(ps);
assert(ps->top > 0);
ps->top--;
}
//输出栈顶的数据
SDataType StackTop(ST* ps)
{
assert(ps);
assert(ps > 0);
return ps->data[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)
{
//1、如果是左括号,入栈
//2、右括号,出栈顶的左括号跟右括号判断是否匹配
//如果匹配就继续如果不匹配退出
ST st;
StackInit(&st);
while (*s != '\0')
{
switch (*s)
{
case '{':
case '(':
case '[':
{
StackPush(&st, *s);
++s;
break;
}
case '}':
case ']':
case ')':
{
if (StackEmpty(&st))
{
StackDestory(&st);
return false;
}
else
{
char top = StackTop(&st);
StackPop(&st);
if ((*s == '}' && top != '{')
|| (*s == ')' && top != '(')
|| (*s == ']' && top != '['))
{
StackDestory(&st);
return false;
}
else
{
++s;
}
break;
}
}
default:
break;
}
}
bool ret = StackEmpty(&st);
StackDestory(&st);
return ret;
}