0
点赞
收藏
分享

微信扫一扫

斯坦福大学iOS应用开发教程学习笔记(第二课) 计算器实现2 改进版

有部分改进,

更改了Calculator部分实现 使用一个递归栈实现。

整个项目下载:https://github.com/junxianhu/Calculator-v2,觉得有帮助的可以点击Star啊,谢谢啦。

贴几个变化的代码:

CalculatorBrain.h


//
//  CalculatorBrain.h
//  Calculator
//
//  Created by cipher on 15/8/27.
//  Copyright (c) 2015年 com.lab1411.cipher. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface CalculatorBrain : NSObject

-(void)pushOperation:(double) operand;
-(double)performOperation:(NSString *)operation;

@property (readonly	)id program;

+ (double)runProgram:(id)program;
+ (NSString *)descriptionOfProgram:(id)program;

@end


CalculatorBrain.m


//
//  CalculatorBrain.m
//  Calculator
//
//  Created by cipher on 15/8/27.
//  Copyright (c) 2015年 com.lab1411.cipher. All rights reserved.
//

#import "CalculatorBrain.h"

//private
@interface CalculatorBrain()

//初始化为nil或0
@property(nonatomic,strong) NSMutableArray *programStack;

@end



@implementation CalculatorBrain

@synthesize programStack = _programStack;
//只有一个变量指针 不分配内存空间

//warning
//这里很重要 刚开始没有更改为programStack,则一直没有初始化
//导致后面的数据 一直加入不到栈中
-(NSMutableArray *)programStack{
    
    //延迟实例化
    if(_programStack == nil){
        _programStack = [[NSMutableArray alloc] init];
    }
    return _programStack;
}

-(void)setOperandStack:(NSMutableArray *)operandStack{
    _programStack = operandStack;
}

//入操作数
-(void)pushOperation:(double) operand{
    //add只能加入对象
    
    [self.programStack addObject:[NSNumber numberWithDouble:operand]];

}

-(id)program{
    
    return [self.programStack copy];
}

+(NSString *)descriptionOfProgram:(id)program{
    return @"implement this in Assignment 2";
}

+(double)popOperandOfStack:(NSMutableArray *)stack{
    

    double result = 0;
    id topOfStack = [stack lastObject];
    
    if (topOfStack) {
        [stack removeLastObject];
    }
    if ([topOfStack isKindOfClass:[NSNumber class]]) {
        result = [topOfStack doubleValue];
        
    }else if([topOfStack isKindOfClass:[NSString class]]){
        
        NSString *operation = topOfStack;
        if ([operation isEqualToString:@"+"]) {
            result =[self popOperandOfStack:stack] + [self popOperandOfStack:stack];
        }else if ([operation isEqualToString:@"/"]){
            
            double tmp2 = [self popOperandOfStack:stack];
            double tmp1 = [self popOperandOfStack:stack];
            if (tmp2 != 0) {
                result = tmp1 / tmp2;
            }
        }else if([operation isEqualToString:@"*"]){
            result = [self popOperandOfStack:stack] * [self popOperandOfStack:stack];
        }else if([operation isEqualToString:@"-"]){
            double tmp2 = [self popOperandOfStack:stack];
            double tmp1 = [self popOperandOfStack:stack];
            result = tmp1 - tmp2;
        }
    }
    return result;
}

+(double)runProgram:(id)program{
    
    NSMutableArray *stack;
    if ([program isKindOfClass:[NSArray class]]) {
        stack = [program mutableCopy];
    }
    return [self popOperandOfStack:stack];
}


-(double)performOperation:(NSString *)operation{
    
    [self.programStack addObject:operation];
    return [CalculatorBrain runProgram:self.program];
}



@end

其他文件不变。

举报

相关推荐

0 条评论