关于一次性处理一串基本 加、减、乘、除 运算 的代码


前两天做一个计算机的项目,其中我的思路是直接接收一串运算表达式,然后再一次性处理,得到结果。

例如:1 + 2 * 3 * 4 / 5 - 6 - 7 + 8 * 9/10 可以直接处理得到结果

我先把这个表达式的数字和运算符分开,并按顺序存入数组中然后处理这个数组

代码如下:

- (double)resultOfExpression:(NSMutableArray *)exp//计算表达式

{

   if(exp==nil)//如果数组为空返回0

    {return0;}

    

    

   if ([expcount]%2==0) {//判断输入的表达式是否格式正确

       return0;

    }

    

   double result;

    

    result=[[exp objectAtIndex:0]doubleValue];

   if ([expcount]==1) {//如果只输入了一个数字则返回本身

       return  result;

    }

    

   //余下的分两种情况

    //1第一个运算符为+-

    if ([[expobjectAtIndex:1]isEqualToString:@"+"]

||[[expobjectAtIndex:1isEqualToString:@"-"])

    {

        

   for (int i=0; i<[expcount]; i++)

    {

       if (i%2!=0)//判断是否是运算符

        {

           //加运算

            if ([[expobjectAtIndex:i]isEqualToString:@"+"])

            {  //如果是“+”运算符

                

               int temp=2;//为了跳转查找运算符

               double tempNumber=0;


           if((i+temp)<[expcount])

            {   //判断下一个运算符是否是 *

               if ([[expobjectAtIndex:i+2]isEqualToString:@"*"]

                    ||[[expobjectAtIndex:i+2]isEqualToString:@"/"])

                {   

                    tempNumber = [[expobjectAtIndex:i+1]intValue];

                   

                    while (1)//循环判断下边有几个 * / 连在一块儿,把他们作为一个块儿运算

                    {  if([[expobjectAtIndex:i+temp]isEqualToString:@"*"]

                          ||[[expobjectAtIndex:i+temp]isEqualToString:@"/"])

                        {

                    

                           if([[expobjectAtIndex:i+temp]isEqualToString:@"*"])

                            {   tempNumber = tempNumber *                                                               [[expobjectAtIndex:i+temp+1]intValue];

                            }

                           if ([[expobjectAtIndex:i+temp]isEqualToString:@"/"])

                            {

                            tempNumber = tempNumber /                                                                    [[expobjectAtIndex:i+temp+1]intValue];                        

                            }

                        }

                        

                        temp+=2;//为了跳向下一个运算符,继续判断

                        

                        //判断下个运算符是否存在,若不存在或存在但是是 + -就结束循环

                       if ((i+temp)>[expcount]-1||

                           [[expobjectAtIndex:i+temp]isEqualToString:@"+"]

                           ||[[expobjectAtIndex:i+temp]isEqualToString:@"-"])

                            {

                               break;

                            }

                    

                        }

                        //结束循环后把这个块儿的值直接与前面的运算结果做 +运算

                        result = result + tempNumber;

                

                    }

            

                    //如果i位置上的下一个运算符不是 * /就直接进行运算

                   else

                    {

                        result = result+[[expobjectAtIndex:i+1]intValue];

                    }

                

                }

               else//如果只有一个操作符则直接运算

                {

                    result = result+[[expobjectAtIndex:i+1]intValue];

                }


            }

   


由于把代码全部传上来实在是有点长,所以只传一种情况的就行,其他情况相应的都好处理

   //如果是 -运算则跟 +运算相似 ,

。。。。。。


   //如果第一个运算符是 * /

    if ([[expobjectAtIndex:1]isEqualToString:@"*"]||                                                   [[expobjectAtIndex:1]isEqualToString:@"/"])

    {

       for (int i=0; i<[expcount]; i++)

        {

            

           if (i%2!=0)//判断是否是运算符

            {

                //若是 * /运算符则直接进行运算

               if ([[expobjectAtIndex:i]isEqualToString:@"*"])

                {

                    result = result * [[expobjectAtIndex:i+1]intValue];

                }

                

               if ([[expobjectAtIndex:i]isEqualToString:@"/"])

                {

                    result = result / [[expobjectAtIndex:i+1]intValue];

                }

                

                //如果遇到了 + -则与上面第一种情况类似

                if ([[expobjectAtIndex:i]isEqualToString:@"+"]||                                                   [[expobjectAtIndex:i]isEqualToString:@""])

                {  

//这里就又回到了第一和第二中情况,然后用同样方法处理

。。。

。。。

。。。

}

}

}

}


当然代码还有一点小瑕疵,例如出错就回返回0,只是我觉得这个算法太麻烦,虽然实现了但不想再去深究了,就这样吧,如果你有比较好的算法或想法可以告诉我,共同学习。 ———— LC


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值