日常刷题16

题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 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;
}

你可能感兴趣的:(c语言)