字符串算术表达式中关于负数的处理

负数转成(0-n)

力扣上有关于算术表达式的题目,

在实际处理算术表达式时,

在把字符串转成表达式中,会有负数出现,可以把负数处理成(0-n)的形式

例如:-1 -> (0-1)

PS:自己只做实现,关于算法优化就不存在了,也为了方便理解,重复的代码也没做优化.

主要分为4种情况:

1.负号出现在首位, -1+1
2.负号出现在首位,且后面存在'(', -(1+1)

3.负号在中间, 1+-1
4.负号在中间,且后面存在'(', 1+-(1+1)
  2,4 也就比 1,2 多了一步判断中间是否有其他括号,要在哪里加上最后的')', eg: 1+-(1+(1+1))

测试数据

-1
--1
--1--2
--(1--2)
1+-(1+1)
-1--1
1+(1+-1)--(1-1) + 1 +-1
-0.11+-2.2

下面直接贴上实现

 //处理删除空格 /r/n /r /t
void negative2Expression(std::string& str, int start = 0)
{
    int ret = str.find('-', start);
    if (-1 != ret)
    {
        negative2Expression(str, ret + 1);
    }
    else
    {
        return;
    }

    if (ret == 0) { //首位是负数 -1

        str.insert(ret, "0");
        str.insert(ret, "(");

        //下一位是不是 ( ; +3 因为添加了 0 (
        if (str[ret + 3] == '(')
        {
            int count_bracket = 0;
            //过滤中间出现的 ()
            for (int j = ret + 3; j < str.size(); j++) { // (0- ( (1+1) + (1+1) )

                if (str[j] == '(') {
                    count_bracket++;

                }else if (str[j] == ')'){
                    count_bracket--;

                }

                if (count_bracket == 0)
                {
                    str.insert(j, ")");
                    break;
                }
            }
        }
        else {

            for (int j = ret + 3; j < str.size(); j++) {// ret + ( , 0 , -

                if (!(str[j] >= '0' && str[j] <= '9') && str[j] != '.') {
                    str.insert(j, ")");
                    ret = j;
                    break;
                }
                else if (j == str.size() - 1)
                {
                    str.push_back(')');
                    break;
                }
            }
        }

    }
    else {
        //不是首位 检测当前 符号的下一个是不是 '-'
        if (str[ret] == '-' && !(str[ret - 1] >= '0' && str[ret - 1] <= '9') && str[ret - 1] != ')') // 1 + -(1+1)
        {
            str.insert(ret, "0");
            str.insert(ret, "(");

            //下一位是不是 ( ; +3因为添加了 0 (
            if (str[ret + 3] == '(') {

                int count_bracket = 0;

                //过滤中间出现的 ()
                for (int j = ret + 3; j < str.size(); j++) {

                    if (str[j] == '(') {
                        count_bracket++;

                    }
                    else if (str[j] == ')')
                    {
                        count_bracket--;

                    }
                     if (count_bracket == 0)
                    {
                        str.insert(j, ")");
                        break;
                    }
                }
            }
            else {

                for (int j = ret + 3; j < str.size(); j++) {// i + ( , 0 , -
                    //下一个符号不是数字, 表示一个完整数字
                    if (!(str[j] >= '0' && str[j] <= '9') && str[j] != '.') {
                        str.insert(j, ")");
                        break;
                    }
                    //到达表达式的末尾,表示一个完整数字
                    else if (j == str.size() - 1)
                    {
                        str.push_back(')');
                        break;
                    }
                }
            }
        }
    }
}

posted @   blackTree  阅读(654)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示