没有那么复杂,只是一个排除法的问题:
(1)+,-只能放在首位或者E,e的后面
(2)E或e,以及小数点只能出现一次,并且:在有E或者e的情况下,小数点不能在E,e后面出现
(3)不能有除了数字,E,e,小数点,+,-之外的其他字符出现
(4)e或E后面必须出现数字,如果后面是+或-,continue,继续判单有没有数字,直到找到为止。
(5)不能是空符号串
代码如下:

class Solution {
public:
    bool isNumeric(char* string)
    {
        int n=strlen(string);
        int cnt1=0,cnt2=0,pos1=0,pos2=0,cnt3=0,pos3=0;
        if(n==0) return false;
        for(int i=0;i<n;i++){
            if(string[i]!='e' && string[i]!='E'&&!(string[i]>='0'&&string[i]<='9')&&string[i]!='.'&&string[i]!='+'&&string[i]!='-')
                return false;
            if(string[i]=='.') cnt1++,pos1=i;
            if(string[i]=='e'||string[i]=='E') cnt2++,pos2=i;
            if(string[i]=='+'||string[i]=='-') cnt3++,pos3=i;
        }
        if(cnt2>=2||cnt1>=2||cnt3>=3) return false;
        if(pos1>pos2&&cnt2!=0)return false;

        if(string[0]=='+'||string[0]=='-') cnt3--;
        if(cnt2&&(string[pos2+1]=='+'||string[pos2+1]=='-')) cnt3--;
        if(cnt3) return false;

        if(cnt2){
            int flag=0;
            for(int i=pos2+1;i<n;i++){
                if(string[i]=='+'||string[i]=='-') continue;
                if(string[i]>='0'&& string[i]<='9'){
                    flag=1;
                    break;
                } 
            }
            if(!flag) return false;
         }
        return true;
    }

};