有效的括号:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
输入:“()”
输出:true
输入:“()[]{}”
输出:true
思路:看大神们的思路,一种是利用栈来实现,也是最为简单的一种想法;另一种是用空白符替换成对的符合要求的括号()、[]、{},若最后字符串为空,则是正确匹配的。
再用第一种方法实现的时候,真实r了,一直提示error:solution.cpp: In member function isValid
Line 5: Char 24: error: control reaches end of non-void function [-Werror=return-type]
map<char,char> sss;
^~~
cc1plus: some warnings being treated as errors
怎么就到了函数结束呢?改了半天具体的操作,才发现是if-else没有成对使用,若只使用if,那么有些情况函数是没有返回值的,这个就报错了,哎,感觉自己sb了,但知道了就会发现原来自己debug的过程真的是缺少经验呀,明明是查到了if-else相关的东西的,却一直在纠结栈的实现思路。。。
class Solution{
public:
bool inValid(string s){
map<char, char> Mytable;
Mytable.insert(map<char, char>::value_type(')', '('));
Mytable.insert(map<char, char>::value_type(']', '['));
Mytable.insert(map<char, char>::value_type('}', '{'));
stack<char> Mystack;
for(int i=0; i!=s.size(); ++i){
if(s[i]=='(' || s[i]=='[' || s[i]=='{'){
Mystack.push(s[i]);
}
else if(s[i]==')' || s[i]==']' || s[i]=='}'){
if(Mystack.empty()) return false;
if(Mytable[s[i]]==Mystack.top()){
Mystack.pop();
continue;
}
else return false;
}
}
if(Mystack.empty()) return true;
else return false; //此处一定要写为else语句,若是写成if(!Mystack.empty()),就会造成有些情况没有返回值,
//可能是自己的编程习惯不好吧(哭)
}
};