前两天做一个计算机的项目,其中我的思路是直接接收一串运算表达式,然后再一次性处理,得到结果。
例如: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:1] isEqualToString:@"-"])
{
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