您现在的位置是:首页 >技术交流 >力扣20 - 有效的括号【C语言实现】网站首页技术交流
力扣20 - 有效的括号【C语言实现】
简介力扣20 - 有效的括号【C语言实现】
题目描述:
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
这里我们可以用栈的特点:后进先出 来解决这个问题 本题使用C来解决 C需要自己手撕栈
//有效的括号
满足以下几点:
1,左括号必须用相同类型的右括号闭合
2,左括号必须以正确的顺序闭合
3,每一个右括号都有一个对应的相同类型的左括号
思路:
如果字符 为左括号 就入栈, 把所有的左括号全部入栈 遇见右括号 就把栈顶元素拿出来
与右括号进行判断是否以正确的顺序闭合。如果不是以正确的顺序闭合 直接返回false 没有必要判断下一个了, 那是正确的顺序闭合。
就把栈顶与右括号 进行判断的字符 删除继续判断下一个 如果是正确的顺序闭合就把栈顶部的元素删了 栈为空
说明栈内部的所有左括号都有一个对应的相同类型的右括号。
typedef char SDataType;
typedef struct StackNode
{
SDataType* a;
int top;
int capacity;
}Stack;
//栈初始化
void StackInit(Stack* ps);
//栈 销毁
void StackDestroy(Stack* ps);
//头部插入
void StackPush(Stack* ps, SDataType x);
//头部删除
void StackPop(Stack* ps);
//栈元素个数
int StackSize(Stack* ps);
//判断是否为空
bool StackEmpty(Stack* ps);
//获取栈顶部的元素
SDataType StackTop(Stack* ps);
//栈初始化
void StackInit(Stack* ps)
{
ps->a = (SDataType*)malloc(sizeof(SDataType) * 6);
if (ps->a == NULL)
{
perror("malloc");
return;
}
ps->top = 0;//top指向 当前栈的下一个元素
ps->capacity = 6;
}
//栈 销毁
void StackDestroy(Stack* ps)
{
free(ps->a);
ps->a = NULL;
ps->capacity = ps->top = 0;
}
//头部插入
void StackPush(Stack* ps, SDataType x)
{
if (ps->top == ps->capacity)
{
SDataType* tmp = (SDataType*)realloc(ps->a, ps->capacity * 2 * sizeof(SDataType));
if (tmp == NULL)
{
perror("realloc");
return;
}
ps->a = tmp;
ps->capacity *= 2;
}
ps->a[ps->top++] = x;
}
//头部删除
void StackPop(Stack* ps)
{
assert(!StackEmpty(ps));
ps->top--;
}
//栈元素个数
int StackSize(Stack* ps)
{
return ps->top;
}
//判断是否为空
bool StackEmpty(Stack* ps)
{
return ps->top == 0;
}
//获取栈顶部的元素
SDataType StackTop(Stack* ps)
{
assert(!StackEmpty(ps));
return ps->a[ps->top - 1];
}
bool isValid(char * s){
Stack s1;
StackInit(&s1);
while(*s != '