閑聊時(shí)提到了這個(gè)功能虾啦,有人覺得用后綴表達(dá)式好一些驹针,也有建議用棧處理的山害。不可否認(rèn)每種方法都有自己的特點(diǎn)和優(yōu)勢,但作為iOS開發(fā)人員惊暴,蘋果為我們提供了很多方便的API接口,讓我有了一個(gè)全新的處理思路趁桃。
在此整理分享辽话,不足還望指出肄鸽。
其實(shí)核心思路就是 充分的利用NSString 的 componentsSeparatedByString:方法 , 將運(yùn)算符分隔開油啤,并用遞歸的方法贴捡,逐個(gè)計(jì)算。
將加減先分割村砂,再分割乘除 烂斋,所以計(jì)算式中 將先運(yùn)算乘除 , 再運(yùn)算加減 础废, 進(jìn)而達(dá)到算數(shù)優(yōu)先級的效果汛骂。
附參考代碼:
- (void)viewDidLoad {
[super viewDidLoad];
NSString *number = @"2+5*3*2-4+7-9/3";
NSLog(@"計(jì)算器 : %@ = %ld",number,[self calculate:number]);
}
- (NSInteger)calculate:(NSString *)number{
NSInteger sum = 0;
if ([number containsString:@"+"] ||
[number containsString:@"-"] ||
[number containsString:@"*"] ||
[number containsString:@"/"]) {
if ([number containsString:@"+"]) {
NSArray *array = [number componentsSeparatedByString:@"+"];
for (NSString *num in array) {
sum += [self calculate:num.copy];
}
return sum;
}
if ([number containsString:@"-"]) {
NSArray *array = [number componentsSeparatedByString:@"-"];
sum = [self calculate:array.firstObject];
for (int i = 1; i < array.count ;i++) {
NSString *num = array[i];
sum -= [self calculate:num.copy];
}
return sum;
}
if ([number containsString:@"*"]) {
NSArray *array = [number componentsSeparatedByString:@"*"];
sum = 1;
for (NSString *num in array) {
sum *= [self calculate:num.copy];
}
return sum;
}
if ([number containsString:@"/"]) {
NSArray *array = [number componentsSeparatedByString:@"/"];
sum = [self calculate:array.firstObject];
for (int i = 1; i < array.count ;i++) {
NSString *num = array[i];
sum /= [self calculate:num.copy];
}
return sum;
}
}else{
sum = number.integerValue;
}
return sum;
}