问题描述:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
范例1:
输入:{}
输出:true
范例2:
输入:({)
输出:false
解题思路:
我们可以将问题简化为一个简单一些的子问题:每当我们在表达式中遇到一对匹配的括号时,我们就从表达式中删除它。然后对问题在递归处理。但是因为我们对整体结构一无所知,所以,我们无法真正地从内到外处理这个问题。
于是,我们可以利用栈后进先出的性质。我们将表达式遍历,每当读入一个左括号,则将其直接入栈,等待与其相匹配的右括号出现;若读入的是右括号,则判断栈顶元素是否是其相匹配的左括号,如果是匹配的话,则将栈顶元素出栈。否则,该表达式不合法。遍历完毕后,如果栈中还存在等待匹配的括号,则说明表达式不合法。
struct Stack{
//定义栈的存储结构
char str[10000];
int top; //表示栈顶元素的下标,初始为-1
};
bool isValid(char * s){
struct Stack stacks;
stacks.top=-1;
int i=0;
if(s==NULL){
return true;
}else{
if(s[0]==')'||s[0]==']'||s[0]=='}'){
//如果第一个元素就是右括号则直接返回false
return false;
}
while(s[i]!='\0'){
if(s[i]=='('||s[i]=='{'||s[i]=='['){
//若当前元素为左括号,则压栈
stacks.top++;
stacks.str[stacks.top]=s[i];
}else{
if(stacks.top==-1){
//若当前元素不为左括号且栈为空则返回false
return false;
}else{
if((stacks.str[stacks.top]=='(' &&s[i]==')')||(stacks.str[stacks.top]=='{'&& s[i]=='}')
||(stacks.str[stacks.top]=='[' && s[i]==']')){
//如果当前元素能够和栈顶元素配对,则将栈顶元素出栈,反之返回false
stacks.top--;
}else{
return false;
}
}
}
i++;
}
if(stacks.top!=-1){
//若将元素全部遍历后,栈中仍还有元素说明并未全部匹配则返回false
return false;
}
}
return true;
}