iOS 實現(xiàn)簡單計算器功能(帶算數(shù)優(yōu)先級)

閑聊時提到了這個功能,有人覺得用后綴表達(dá)式好一些,也有建議用棧處理的。不可否認(rèn)每種方法都有自己的特點(diǎn)和優(yōu)勢,但作為iOS開發(fā)人員,蘋果為我們提供了很多方便的API接口,讓我有了一個全新的處理思路。
在此整理分享,不足還望指出。


其實核心思路就是 充分的利用NSString 的 componentsSeparatedByString:方法 , 將運(yùn)算符分隔開,并用遞歸的方法,逐個計算。

將加減先分割,再分割乘除 ,所以計算式中 將先運(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(@"計算器 : %@ = %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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容