[LeetCode] Valid Number 使用有限状态机

在开始的时候对字符串进行了预处理消除了首尾的空格

class Solution {

  public:
    //每次输入字符类型
    enum INTPUT_TYPE{
      SIGNAL=0,//输入的为符号位
      DIGIT=1,//输入的诶数字0-9
      DOT=2,//逗点,
      EXP=3,//指数e或E
      INVALID=5,//无效字符
      END=4,//结束符
      COUNT=6,//表示输入字符类型的个数
      T=98,//表示有效数字
      F=99,//表示非有效数字
    };

//状态图
//开始--符号--数字--逗点--数字--e--符号--数字--结束
int transitionTable[9][COUNT]{
//   +- 0-9 . e/E  \0  INVALID
    {1,  2, 3, F,  F,   F}, //初始状态0
    {F,  2, 3, F,  F,   F}, //状态1,第一个符号,
    {F,  2, 4, 6,  T,   F},//状态2,数字(之前无逗点)
    {F,  5, F, F,  F,   F},//状态3,逗点(之前无数字)
    {F,  5, F, F,  T,   F},//状态4,逗点(在数字之后)
    {F,  5, F, 6,  T,   F},//状态5,数字(在逗点之后)
    {7,  8, F, F,  F,   F},//状态6,指数(e或E)
    {F,  8, F, F,  F,   F},//状态7,符号位(e之后)
    {F,  8, F, F,  T,   F},//状态8,数字(e之后)

};

INTPUT_TYPE getType(char ch){

    if(ch=='+'||ch=='-') return SIGNAL;
    else if(ch=='.') return DOT;
    else if(ch>='0'&&ch<='9') return DIGIT;
    else if(ch=='e'||ch=='E') return EXP;
    else if(ch=='\0') return END;
    else return INVALID;

}

bool isNumber(string s){

    //预处理消除字符串首尾的空格
    while(*(s.begin())==' ') s.erase(s.begin());
    while(*(s.end()-1)==' ') s.erase(s.end()-1);

    if(s.empty()) return false;

    const char *str=s.c_str();

    int state=0;//初始状态为0

    while(state!=(int)T&&state!=(int)F){

        INTPUT_TYPE intype=getType(*str);
        cout<<"输入类型"<

你可能感兴趣的:([LeetCode] Valid Number 使用有限状态机)