思路一:
顺着看,看右括号,每个右括号都有左括号或者*与之匹配
逆着看,看左括号,每个左括号都有右括号或者*与之匹配
bool isValidString(char* s ) {
    // 每一个右括号都有一个左括号或者*与之匹配
    int L=0,S=0,i=0;
    while(s[i] != '\0'){
        if(s[i] == '('){
            L++;
        }
        else if(s[i] == '*'){
            S++;
        }
        else if(s[i] == ')'){
            if(L>0)      L--;
            else if(S>0) S--;
            else    return 0;
        }
        i++;
    }
    // 每一个左括号都有一个右括号或者*与之匹配
    int R=0,S2=0;
    i=strlen(s)-1;//注意是逆序,倒着看
    while(s[i] != '\0'){
        if(s[i] == ')'){
            R++;
        }
        else if(s[i] == '*'){
            S2++;
        }
        else if(s[i] == '('){
            if(R>0)      R--;
            else if(S2>0) S2--;
            else    return 0;
        }
        i--;
    }
    
    if(L<=S && R<=S2)    return 1;
    else return 0;
}


思路二:
用链表,方便删除节点,没有实现