项目——C++规则下的数字解析器

一、语言规则

数值(按顺序)可以分成以下几个部分:

  1. 若干空格
  2. 一个 小数 或者 整数
  3. (可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
  4. 若干空格

小数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符(’+’ 或 ‘-’)
  2. 下述格式之一:
    至少一位数字,后面跟着一个点 ‘.’
    至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
    一个点 ‘.’ ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符(’+’ 或 ‘-’)
  2. 至少一位数字
注意:
1. 0开头的整数被视为合法
4. 指数e/E后 只能跟整数
5. 注意处理小数的三种格式

二、有限状态机

在这里插入图片描述

三、编程思路

注:可选情况不满足不返回false ,必须情况不满足及时返回false

  1. 处理空格(可选)
  2. 处理+/-(可选)
  3. 分割整数/小数——字符串寻找是否包含’.’(二选一)
  4. 处理整数——0~9组成(必须)
  5. 处理小数——0~9 . 0~9 组成,其中,可以无前,或无后(必须)
  6. 处理指数——e/E后 跟 符号+整数(可选)
  7. 处理空格(可选)
  1. 处理单个或多个空格(可选)
		if (s[i] == ' ') {//空格
            i++;
            while (s[i] == ' ')
                i++;
        }
  1. 处理单个 + / -(可选)
		if (s[i] == '-' || s[i] == '+')//符号
            i++;
  1. 分割整数和小数——字符串寻找是否包含’.’
		 if (s.find('.')!=string::npos) {
		 	//小数
		 }
		 else{
		 	//整数
		 }
  1. 处理整数——单个或多个0~9组成(必须)
			if (isdigit(s[i])) {
                i++;
                while (isdigit(s[i]))
                    i++;
            }
            else
                return false;
  1. 处理小数——0~9 . 0~9 ,其中可 .0~90~9.(必须)
			if (isdigit(s[i])) {//.前面有数字
                i++;
                while (isdigit(s[i]))
                    i++;
                if (s[i] == '.') {
                    i++;
                    while (isdigit(s[i]))
                        i++;
                }//数字后不是紧跟. 返回false
                else
                    return false;
            }
            else if (s[i] == '.') {//.前面无数字
                i++;
                if (isdigit(s[i])) {
                    i++;
                    while (isdigit(s[i]))
                        i++;
                }
                else//.前面无数字后面也无数字返回false
                    return false;
            }
            else
                return false;
        
  1. 处理指数——e/E后 跟 符号整数(可选)
			if (s[i] == 'e' || s[i] == 'E') {//指数
	            i++;
	            if (s[i] == '-' || s[i] == '+')//符号
	                i++;
	            if (isdigit(s[i])) {//整数
	                i++;
	                while (isdigit(s[i]))
	                    i++;
	            }
	            else//e/E后面未跟整数 返回false
	                return false;
       		}
  1. 处理空格(可选)
    	if (s[i] == ' ') {//空格
            i++;
            while (s[i] == ' ')
                i++;
        }

四、代码整合

#include <iostream>
using namespace std;

class Solution {
    bool isdigit(char c) {
        return c >= '0' && c <= '9';
    }
public:
    bool isNumber(string s) {
        int i = 0;
        if (s[i] == ' ') {//空格
            i++;
            while (s[i] == ' ')
                i++;
        }
        
        if (s[i] == '-' || s[i] == '+')//符号
            i++;

        if (s.find('.')!=string::npos) {//小数
            if (isdigit(s[i])) {//.前面有数字
                i++;
                while (isdigit(s[i]))
                    i++;
                if (s[i] == '.') {
                    i++;
                    while (isdigit(s[i]))
                        i++;
                }
                else
                    return false;
            }
            else if (s[i] == '.') {//.前面无数字
                i++;
                if (isdigit(s[i])) {
                    i++;
                    while (isdigit(s[i]))
                        i++;
                }
                else
                    return false;
            }
            else
                return false;
        }
        else {//整数
            if (isdigit(s[i])) {
                i++;
                while (isdigit(s[i]))
                    i++;
            }
            else
                return false;
        }
        if (s[i] == 'e' || s[i] == 'E') {//指数
            i++;
            if (s[i] == '-' || s[i] == '+')//符号
                i++;
            if (isdigit(s[i])) {//整数
                i++;
                while (isdigit(s[i]))
                    i++;
            }
            else
                return false;
        }

        if (s[i] == ' ') {//空格
            i++;
            while (s[i] == ' ')
                i++;
        }
        if (i == s.size())
            return true;
        else
            return false;
    }
};

五、测试用例

int main(){
	Solution test;
    cout << "正例" << endl;
    cout << test.isNumber("0123") << endl;//整数
    cout << test.isNumber("123.") << endl;//小数
    cout << test.isNumber("+.12") << endl;//小数
    cout << test.isNumber("+13.56") << endl;//小数
    cout << test.isNumber("-3.1415e12  ") << endl;//指数
    cout << test.isNumber("  3415E+12") << endl;//指数
    cout << "反例" << endl;
    cout << test.isNumber("+-0123") << endl;
    cout << test.isNumber("123.a") << endl;
    cout << test.isNumber("+..12") << endl;
    cout << test.isNumber("1+3.e056") << endl;
    cout << test.isNumber(".") << endl;
}

六、运行结果

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值