有效的括號:
給定一個只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判斷字符串是否有效。
有效字符串需滿足:
- 左括號必須用相同類型的右括號閉合。
- 左括號必須以正確的順序閉合。
注意空字符串可被認爲是有效字符串。
輸入:“()”
輸出: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()),就會造成有些情況沒有返回值,
//可能是自己的編程習慣不好吧(哭)
}
};