【题目描述】
给定一个只包含 ’ ( ‘,’ ) ', ’ { ‘,’ } ', ’ [ ‘,’ ] ’ 的字符串,判断字符串是否有效。
有效字符串需满足:
1、左括号必须用相同类型的右括号闭合。
2、左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例1:
输入:“( )”
输出:true
示例2:
输入:“( )[ ]{ }”
输出:true
示例3:
输入:“( ]”
输出:false
示例4:
输入:“( [ ) ]”
输出:false
示例5:
输入:”{ [ ] }“
输出:true
【栈】
所谓栈,就是符合“后进先出”(Last In First Out,LIFO)规则的数据结构,有push和pop两种操作,其中push把元素压入“栈顶”,而pop从栈顶把元素“弹出”。
STL的栈定义在头文件中,可以用“stackst”方式声明一个栈,其中type表明定义类型。
【代码】
class Solution {
public:
bool isValid(string s) {
stack<char>st;
for(int i=0;i<s.length();i++)
{
// 入栈:'(','{','['
if(s[i]=='('||s[i]=='{'||s[i]=='[')
{
st.push(s[i]);
}
else if(st.empty()&&(s[i]==')'||s[i]=='}'||s[i]==']'))
{
return false; //栈为空,且s[i]=')','}',']',匹配失败
}
else //栈不为空
{
if(s[i]==')'&&st.top()!='(')
return false;
else if(s[i]=='}'&&st.top()!='{')
return false;
else if(s[i]==']'&&st.top()!='[')
return false;
else
st.pop(); //匹配成功,出栈
}
}
if(!st.empty())
return false; //循环遍历结束。栈非空,则匹配失败
return true; //循环遍历结束。栈空,则匹配成功
}
};