試題請參見: https://oj.leetcode.com/problems/valid-parentheses/
題目概述
Given a string containing just the characters '('
, ')'
, '{', '}'
, '['
and ']'
, determine if the input string is valid.
The brackets must close in the correct order, "()"
and "()[]{}"
are all valid but "(]"
and "([)]"
are not.
解題思路
數據結構典型的例題, 當我們讀到左邊的括號(包括'('
, '['
和'{'
)時, 壓入堆棧. 當讀取到右邊的括號時, 取堆棧頂端的元素進行比對, 若不匹配, 則說明表達式中的括號也無法配對.
遇到的問題
[][
的情況
當字符串讀取結束後, 堆棧中元素可能不爲空, 此時的括號一定無法完全匹配.
[]]
的情況
當讀取到第2個]
時, 我們會調用stack.top()
函數. 但此時堆棧爲空, 因此會出現Segment Fault異常.
源代碼
class Solution {
public:
bool isValid(std::string s) {
for ( auto itr = s.begin(); itr != s.end(); ++ itr ) {
if ( *itr == '(' || *itr == '[' || *itr == '{' ) {
st.push(*itr);
} else if ( *itr == ')' || *itr == ']' || *itr == '}' ) {
if ( st.empty() ) {
return false;
}
char topChar = st.top();
if ( *itr == ')' && topChar != '(' ) {
return false;
} else if ( *itr == ']' && topChar != '[' ) {
return false;
} else if ( *itr == '}' && topChar != '{' ) {
return false;
}
st.pop();
}
}
if ( st.empty() ) {
return true;
} else {
return false;
}
}
private:
std::stack<char> st;
};