20. 有效的括号
难度简单
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
思路
- “(){}}{”
- 报错:Line 171: Char 16: runtime error: reference binding to misaligned address 0xbebebebebebec0ba for type ‘int’, which requires 4 byte alignment (stl_deque.h) 0xbebebebebebec0ba: note: pointer points here SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/…/lib/gcc/x86_64-linux-gnu/9/…/…/…/…/include/c++/9/bits/stl_deque.h:180:16
- 解决:初始化a.push(‘a’); 防止栈为空时,取a.top()
代码
class Solution {
public:
bool isValid(string s) {
stack<int> a;
a.push('a');
a.push(s[0]);
for(int i=1;i<s.length();i++)
{
printf("%d\n",i);
if(s[i]==')'||s[i]==']'||s[i]=='}')//消除a
{
if(s[i]==')'&&a.top()=='(')
a.pop();
else if(s[i]==']'&&a.top()=='[')
a.pop();
else if(s[i]=='}'&&a.top()=='{')
a.pop();
else
return false;
}
else
a.push(s[i]);
}
if(a.top()=='a')
a.pop();
if(a.empty())
return true;
else
return false;
}
};