数据结构---栈知识点之括号匹配问题(C语言)

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。
示例 1:

输入: “()”
输出: true

示例 2:

输入: “()[]{}”
输出: true

示例 3:

输入: “(]”
输出: false

示例 4:

输入: “([)]”
输出: false

示例 5:

输入: “{[]}”
输出: true

数据结构---栈知识点之括号匹配问题(C语言)_第1张图片
首先是第一个代码,创建出一个长度为字符串大小一半的空间,如果有左括号的话,将所有的左括号放进空间,然后在拿出来作比较,这个 代码的缺陷是 没有释放申请的空间,可能会导致内存泄漏问题,下面附上代码。

bool isValid(char * s)
{
    int length = 0;
    while(*(s+length))
    {
        length++;  //获取字符串长度
    }
    char *ptr = (char*)malloc(sizeof(char)+length/2+1);//这里申请的空间是比源字符串长度多了两个空间,因为如果源字符串的长度是三个的话,在下面的for循环中就越界了,而且a++在前,新的字符串中开始储存的地址是ptr[1],所以就多给了两个空间。
    memset(ptr,0,length/2);//初始化
    int i, a = 0;
    for(i = 0; i < length; i++)
    {
        if((*(s+i) == '(') ||( *(s+i) == '{') || (*(s+i) == '['))
        {
            a++;
            *(ptr+a) = *(s+i);
     
        }
        //'(' 和‘)’的ASCII码值差1,‘{’ 和‘}’,‘[’ 和 ']'差2
        else if((*(s+i) == (*(ptr+a)+1))||(*(s+i) == (*(ptr+a)+2)))
        {
            a--;
        }
        else
            return 0;
    }
    if(a)
        return 0;
    return 1;
}

然后下面是一个改良版本,申请的空间是和源字符串相同的大小,防止出现全部都是左括号的情况,并且解决了预防了内存泄漏的问题

bool isValid(char * s){
 int len = strlen(s);
    if(len % 2 == 1) // 奇数直接返回
        return false;
    char *temp = (char*)malloc(len);
    //考虑‘(((’的情况
    memset(temp, 0, len);
    int i, count = 0;
    for(i = 0; i < len; i++)
    {
        if(s[i] == '('||s[i] == '{'||s[i] == '[')
        {
            temp[count] = s[i];
            count++;
        }
        else if((count != 0)&&((s[i] == temp[count-1]+1)||(s[i] == temp[count-1] + 2)){
            count--;
        }
        else
        {
            free(temp);//将申请的空间释放
            return false;
        }
    }
    return temp;
    if(count == 0)
        return true;
    return false;
}







你可能感兴趣的:(数据结构---栈知识点之括号匹配问题(C语言))