这道括号匹配虽然简单,但也没有一次过,发现还是有些问题需要总结,s[i]的时候需要看是否越界,因此前面要处理i越界了的情况,此时栈不空,也即有前面的左括号未匹配,最后面出战可能有except,查看是否此时可能栈空可能,当时i没到头,但是栈已空,也即后面有未匹配的右括号,因此此处处理占空的情况。后面还有一个访问s[i],此处可能越界,分析发现不可能越界string,因为越界while里第一句处理,占空在出战时处理,因此此时访问必是安全的。
bool isValid(string s) {
if(s.length()==0) return true;
stack<char> S;
int i=0;
//S.push(s[i]); 这两句可有可无。
//i++;
while(!S.empty()||i<s.length())
{
if(i==s.length())
return false;
if(s[i]=='('||s[i]=='['||s[i]=='{')
{
S.push(s[i]);
}
else
{
if(S.empty()) return false;
char c=S.top();
S.pop();
if((c=='('&&s[i]==')') || (c=='['&&s[i]==']') || (c=='{'&&s[i]=='}'))
;
else
return false;
}
i++;
}
return true;
}