题目描述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
解题思路
看了官方解答写的
c语言用一个数组表示栈,同时需要一个栈顶指针top初始=0
用strlen获取数组长度
1.若数组长度为奇数,必定不符合要求 false
2.若先读到右括号,必定不闭合,返回false
3.若读到的右括号与栈顶的左括号不匹配,返回false
4.若读到的右括号与栈顶的左括号匹配,top–,可视为出栈
5.若读到的是左括号,压栈,top++
若最后栈不为空,即有左括号未匹配到右括号,false
代码
char pair(char s){
if(s == ')')return '(';
if(s == '}')return '{';
if(s == ']')return '[';
return 0;
}
bool isValid(char * s){
int length = strlen(s);
if(length %2 == 1)return false;
int stack[length + 1], top = 0;
for(int i = 0; i < length; i++){
char ch = pair(s[i]);
if(ch){
if(top == 0 || stack[top-1] != ch){
return false;
}
top--;
}
else{
stack[top++] = s[i];
}
}
return top == 0;
}