给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
用栈的思想求解这个题目,遇到左括号入栈,右括号出栈。
该题在本人的数据结构笔记栈和队列示例中也有提到(如果有兴趣可以去看更多实例)
1:遍历输入的括号序列,如果是左括号,进入2,如果是右括号,进入3
2:如果当前遍历到左括号,则入栈
3:如果当前遍历到右括号,则出栈一个元素,看其是否与当前的右括号组成一对,如果不是,则匹配失败。或者在出栈过程中发生异常(从空栈中出栈),也匹配失败
4:若能顺利遍历完成,检查栈中是否还有剩余元素,如果有,则匹配失败;如果没有,则匹配成功。
以下用数组,即顺序表,实现了栈的思想,只是用了栈的思想,并没有完全定义栈,如果要看更规范的代码建议去本人的数据结构笔记栈和队列示例
另外,力扣给的返回类型是bool,只需把0替换成false,把1替换成true即可
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include<stdbool.h>
int isValid(char * s)
{
int str = strlen(s);
char s1[10000] = "\0";
int i = 0 ,j = 0;
if (str % 2 == 1)
return 0;
for (i = 0; i < str ; i++)
{
if (s[0] == ')' || s[0] == ']' || s[0] == '}')
return 0;
if (s[i] == '(' || s[i] == '[' || s[i] == '{')
{
s1[j] = s[i];
j++;
}
if (s[i] == ')')
{
if (j <= 0 || s1[j - 1] != '(')
return 0;
else
{
s1[j - 1] = '\0';
j--;
}
}
if (s[i] == ']')
{
if (j <= 0 || s1[j - 1] != '[')
return 0;
else
{
s1[j - 1] = '\0';
j--;
}
}
if (s[i] == '}')
{
if (j <= 0 || s1[j - 1] != '{')
return 0;
else
{
s1[j - 1] = '\0';
j--;
}
}
}
if (s1[0] == '\0')
return 1;
else
return 0;
}
int main()
{
char s[] = "()";
int i = -1;
i = isValid(s);
printf("%d", i);
return 0;
}