给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
// 定义栈的结构体
struct Stack
{
char *p; //栈底指针
int size; //栈中数据个数
int capacity; //栈容量
};
//栈的初始化
void StackInit(struct Stack* st)
{
st->p = (char*)malloc(sizeof(char)*3);
st->size = 0;
st->capacity = 3;
}
//扩容
void StackEnlarge(struct Stack* st)
{
st->p = (char*)realloc(st->p,sizeof(char)*st->capacity*2);
st->capacity *= 2;
}
//入栈
void StackPush(struct Stack* st,char x)
{
if(st->size == st->capacity )
StackEnlarge(st);
st->p[st->size] = x;
st->size ++;
}
//出栈
void StackPop(struct Stack* st)
{
st->size--;
}
//获取栈顶元素
char StackTop(struct Stack* st)
{
return st->p[st->size-1];
}
//栈判空
bool StackEmpty(struct Stack* st)
{
if(st->size == 0)
{
return true;
}
return false;
}
//栈销毁
void StackDestroy(struct Stack* st)
{
free(st->p);
}
bool isValid(char * s){
//创建栈
struct Stack st;
StackInit(&st);
//先在栈中压入一个不为括号的字符,避免当右括号比左括号多时程序出错
StackPush(&st,'c');
//遍历字符串,如果遇到左括号,就入栈
while(*s != '\0')
{
if(*s =='(' || *s == '[' || *s == '{')
{
StackPush(&st,*s);
s++;
}
//如果碰到右括号,那么与栈顶的字符进行匹配
//匹配成功将栈顶字符出栈,程序继续执行,匹配失败说明字符串括号无效,直接返回
else
{
char i = StackTop(&st);
if((i == '('&& *s == ')') ||
(i == '['&& *s == ']') ||
(i == '{'&& *s == '}'))
{
StackPop(&st);
*s++;
}
else
{
StackDestroy(&st);
return false;
}
}
}
//如果循环结束,栈中只有开始时压入的字符,那说明字符串中括号是有效的
//出栈一个字符串,然后判空
StackPop(&st);
bool i = StackEmpty(&st);
StackDestroy(&st);
if(i)
{
return true;
}
return false;
}