前言
本文记录的是力扣最热门的100道题里面的有效括号,采用C语言和栈的思路解决。
一、题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
二、解题思路和关键代码
1.思路
代码如下(示例):
false的情况:
①要想匹配成功,括号的数目必须是双数,成对!否则,false。
②只要符号数组第一个是右括号,都要返回false。(第一个是右括号,怎么样都无法闭合)
③字符串为空,返回false
true的情况
假如是"{()}"
当遇到第一个右括号’)’,返回’(’,看看是否与栈顶匹配,匹配的话,top指向栈顶-1。以此类推。
一旦发现不匹配,返回fasle。
2.关键代码
代码如下(示例):
char Get_Pairs(char a){
//遇到右括号,就返回对应的左括号
if(a == ')') {
return '(';
}
if(a == ']') {
return '[';
}
if(a == '}') {
return '{';
}
//遇到左括号,直接返回0
return 0;
}
bool isValid(char * s){
int n = strlen(s); //求出字符数组的长度
if(0 != (n % 2) ) { //单数返回false
return false;
}
char ch, stk[n+1];
int i, top = 0;
for(i = 0; i < n; i++) {
ch = Get_Pairs(s[i]);
if(ch){
if(0 == top || ch != stk[top-1]){ //如果第一个字符是右括号,ch>0, 而且top等于0 ,证明数组栈没有左括号,就返回false
return false;
}
top--;
} else {
stk[top] = s[i];
top++;
}
//如果一开始遇到左括号就继续
}
return (0 == top);
}