20. 有效的括号
1.栈模拟
-
对于栈的使用,最为经典的应用场景就是括号匹配。
- 遇到括号的前半部,就压入。
- 遇到后半部,如果栈为空,说明多出了一个括号的后半部,返回错误;如果栈非空,弹出栈顶元素,判断与后半部是否匹配。
- 遍历完输入字符串时,如果栈为空,说明匹配完成,否则返回错误。
-
class Solution { public: bool isValid(string s) { stack<char> stk; for(int i=0;i<s.size();i++){ if(s[i]=='('||s[i]=='['||s[i]=='{'){ stk.push(s[i]); }else{ if(stk.empty()){ return false; } char c=stk.top(); stk.pop(); if((s[i]==')'&&c=='(')||(s[i]==']'&&c=='[')||(s[i]=='}'&&c=='{')){ continue; }else{ return false; } } } return stk.empty(); } };
2.map辅助
-
对于匹配的问题,无论是何种类型的数据,可以使用map辅助。
-
class Solution { public: bool isValid(string s) { stack<char> stk; unordered_map<char,char> mapp={{'(',')'},{'[',']'},{'{','}'}}; for(int i=0;i<s.size();i++){ if(s[i]=='('||s[i]=='['||s[i]=='{'){ stk.push(s[i]); }else{ if(stk.empty()){ return false; } char c=stk.top(); stk.pop(); if(s[i]==mapp[c]){ continue; }else{ return false; } } } return stk.empty(); } };