有效的括号(leetcode)-栈
****leetcode题目链接
思路:
从头开始,把每一个左括号对应的右括号入栈,当遇到右括号时,看栈顶元素是不是遇到的右括号,是就出栈继续,不是的话就返回false。
举个栗子:
{ ( [ ] ( ) ) }
1 2 3 4 5 6 7 8
从左往右,将**{ ( [** 对应的 ***} )]***入栈,当碰到右括号 ] 时,将它与栈顶元素比较,相等就出栈,进行下面的工作,将 ( 对应的 ) 入栈,碰到 )将它与栈顶元素比较,相等出栈,一直处理完所有的元素。
理解:
从左往右入栈左括号对应的右括号,最先入栈的右括号一定是最外层的括号,就应该把它放到栈底最后比较。同理,最后入栈的右括号一定是最里层的,它在栈顶,所以当我们遇到第一个右括号时先与栈顶比较,因为它对应的左括号的右括号在栈顶,只有相等时才证明括号成对出现且中间不包含其它的括号。
AC代码
class Solution {
public:
bool isValid( string s ) {
stack<char>st; //栈容器,不允许遍历
for( int i = 0; i < s.size(); i++ ) {
//碰到左括号时,将对应的右括号入栈
if( s[i] == '(' || s[i] == '[' || s[i] == '{' ) {
char choice = s[i];
switch( choice ) {
case '(':
st.push( ')' );
break;
case '[':
st.push( ']' );
break;
case '{':
st.push( '}' );
break;
default:
break;
}
} else { //碰到右括号时,与栈顶元素比较
//当有右括号但栈为空时,说明括号不是成对存在的,返回0
if( st.empty() ) {
return 0;
}
//右括号等于栈顶元素,比较成功,说明成对存在,出栈比较下一个元素
if( s[i] == st.top() ) {
st.pop();
} else { //不等时说明括号不成对或者括号中夹杂着 其它单括号
return 0;
}
}
}
//可能出现([{ }] 缺少右括号的情况,所以要判断栈是否为空
return st.empty() ? 1 : 0;
}
};