题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
(来源:力扣(LeetCode))
思路:使用栈的思想,遇到左括号入栈,遇到右括号出栈,与当前的右括号匹配,若正好为"()""[]""{}"组合,则继续对下一个输入括号判断,否则就输出匹配错误。
代码:
bool isValid(char * s)
{
int i=0,len=0,top=-1;
char *p,temp;
if(s[0]=='\0')
return 1;//题目意思
len=strlen(s);
if(s[0]!='\0'&&len%2)
return 0;/*若输入的括号串长度奇数,
则必不可能匹配成功,直接返回否,简化计算*/
p=(char*)malloc(len*sizeof(char));
while(s[i]!='\0')
{
if(s[i]=='('||s[i]=='['||s[i]=='{')
{
++top;
p[top]=s[i];
i++;
}//左括号,入栈
else if(s[i]==')'||s[i]==']'||s[i]=='}')
{
if(top==-1)
return 0;/*考虑只输入右括号的情况,这样
则必不可能匹配成功,直接返回否*/
temp=p[top];
--top;//栈顶元素出栈,进行匹配
if(s[i]-temp==1||s[i]-temp==2)/*查ASCII码
表可知,‘(’为40,‘)’为41,‘[’为91,‘]’为
93,‘{’为123,‘}’为125,这里是匹配成功的情况*/
{
i++;
continue;//继续下一个
}
else
return 0;
}
}
if(top!=-1)
return 0;//循环结束时,如果栈内还有元素,返回否
else
return 1;
}