题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例:
输入:s = "()" 输出:true 输入:s = "([)]" 输出:false
解题思路:看到这种题,我们需要用栈的先进后出的思想来解决 ,当目前的符号是'('、‘{’、'[',我们只需要让这些符号入栈,并将栈顶做标记,当出现反括号时,我们需要将出现的符号和栈顶符号比较,如果匹配,则出栈,栈顶减1,如果不匹配,那么判定字符串无效。字符串判断结束后,我们需要检查栈是否为空,为空的话则表明字符串有效,否则字符串无效。
C版代码实现
char match (char s)
{
if(s==')')
{
return '(';
}
if(s==']')
{
return '[';
}
if(s=='}')
{
return '{';
}
return 0;
}
bool isValid(char * s)
{
int size = strlen(s);//字符串的长度
char stack[size+1];
int top = 0;
for(int i = 0 ; i < size;i++)
{
char ch = match(s[i]);
if(ch)
{
if(top==0 || stack[top-1] != ch)
{
return false;
}
top--;
}
else
{
stack[top] = s[i];
top++;
}
}
return (top==0);
}
C++版代码的实现
bool isValid(string s)
{
stack <char> tmp;
for (int i = 0; i < s.size(); i++)
{
if (!tmp.empty())
{
if (s[i] == ')'&&tmp.top() == '(' ||
s[i] == '}'&&tmp.top() == '{' ||
s[i] == ']'&&tmp.top() == '[')
{
tmp.pop();
continue;
}
}
tmp.push(s[i]);
}
return tmp.empty();
}