有效的括号(lc20)
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
知识点:栈 后进先出的特性
思路:先判断括号是左括号还是右括号。如果为左括号的话则入栈,一旦遇到右括号,将栈中的栈顶出栈,然后判断此时的括号与出栈的元素是否恰为一对括号,如果不是则该组括号不是有效括号,返回false;若最后栈为空,则表明为有效的括号;
需要注意的地方:
(1)首括号为右括号的时候;
(2)括号须为偶数个;
(3)c++中的栈操作pop(),返回值为void; top()返回栈顶的引用,若想提取栈顶元素,则用s.top();
C++
```cpp
class Solution {
public:
bool isValid(string s) {
if((s.size())%2!=0)
return false;
stack<char> stack;
for(int i=0;i<s.size();i++){
if(isLeft(s[i])){
stack.push(s[i]);
}
else{
if(stack.empty()) {return false;}
char now= stack.top();
if((now=='('&&s[i]!=')')||(now=='['&&s[i]!=']')||(now=='{'&&s[i]!='}')){
return false;
}
stack.pop();
}
}
return stack.empty();
}
bool isLeft(char c)
{ if(c=='('||c=='['||c=='{')
return true;
else return false;}
};
Java
//自己提交
class Solution {
public boolean isValid(String s) {
if((s.length()%2)!=0)
{
return false;
}
Stack<Character> stack = new Stack<>(); //创建 stack 对象
for(int i=0;i<s.length();i++)
{
char c = s.charAt(i);
if(isleft(c)){
stack.push(c);
}
else{
if(stack.isEmpty())//判断首括号是否为右括号
return false;
char top = stack.pop();
if(c == ')' && top != '(')
return false;
if(c == ']' && top != '[')
return false;
if(c == '}' && top != '{')
return false;
}
}
return stack.isEmpty(); //检查栈是否为空
}
public boolean isleft(char c) {
if(c=='('||c=='['||c=='{')
{ return true;
}
else {return false;}
}
}