每日一题
有效括号序列
题目链接
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d37c834d6d87e7bd3ff12a7b9f73c060.png)
思路
- 我们先来看几个有效括号序列:” () {} [] “、“( [ ] )”,我们可以发现如果任意一个左括号的右边紧跟的是一个右括号,那么这两个左右括号必须是相同类型。否则,这必定是一个无序的括号序列
- 那么,我们怎么实现着这种判断呢。我们可以发现,最先出现的右括号一定是和最晚出现的左括号进行匹配,那么我们就可以用栈先进后出的特性进行处理。
具体步骤
- 首先创建一个大小合适的栈
- 遍历字符串,如果字符串元素为‘ ( ’,‘ [ ’ ,’ { ’的任意一个,那么就将这个元素存入栈中。
- 如果字符串的元素为‘ ) ’,‘ ] ’,‘ } ’的任意一个,那么就将这个元素与栈顶元素(最晚出现的右括号)进行比较。
- 如果栈为空,说明第一个即为右括号,必为无序括号序列,返回false。
- 如果左右括号不匹配,则必为无序括号序列,返回false。
- 如果括号匹配,则继续遍历字符串,直到遍历完毕。
- 如果遍历完字符串后栈元素不为空,那么说明这个括号序列只有‘ ( ’,‘ [ ’ ,’ { ’的任意一个,返回false。
- 如果运行完上述功能还未返回,则说明为有效括号序列,返回true。
实现代码
static char stIn[10000];
static int topIn = 0;
bool isValid(char* s ) {
for(int i=0; s[i]!='\0';i++)
{
if(s[i] == '(' || s[i] == '[' || s[i] == '{')
stIn[topIn++] = s[i];
if(s[i] == ')' || s[i] == ']' || s[i] == '}')
{
if(topIn == 0)
return false;
if(s[i] == ')')
if(stIn[--topIn] != '(')
{
return false;
}
if(s[i] == ']')
if(stIn[--topIn] != '[')
{
return false;
}
if(s[i] == '}')
if(stIn[--topIn] != '{')
{
return false;
}
}
}
if(topIn)
return false;
return true;
}