首页 > 代码库 > [Stanford] RPN Calculator(model)

[Stanford] RPN Calculator(model)

CalculatorBrain.h

//建model------菜单 > NewFile > iOS > Cocoa Touch > Objective-C class // 完成操作数入栈和完成栈上的操作#import <Foundation/Foundation.h>@interface CalculatorBrain : NSObject    -(void)pushOperand:(double)operand;   -(double)performOperation:(NSString *)operation;@end

 

CalculatorBrain.m

//这就是model,接受操作数,返回运算结果 #import "CalculatorBrain.h"@interface CalculatorBrain() //private的 @property(nonatomic,strong)NSMutableArray *operandStack; //一定要是strong,因为只有我们在使用这个指针,strong会告诉 @end                                                     //编译器怎么管理内存,当property创建时值为0或者nil,发消息给nil什么也不发生                   //提问:如果不用nonatomic会怎样?会有警告。因为重载了getter但没重载setter,但是又要锁线程,所以给你一个警告。 @implementation CalculatorBrain @synthesize operandStack=_operandStack; //@synthesize不会生成getter了,因为底下我们自己实现了                                             //提问:synthesize会自动分配空间吗?不会,synthesize只有一个变量指针,需要你来分配空间-(NSMutableArray *)operandStack                       //NSMutableArray的getter方法实现:如果operandStack为空那就分配一个数组 {                                                                   //现在这个operandStack不可能是nil了       if(_operandStack==0)             _operandStack=[[NSMutableArray alloc] init];  //lazy instantiation 延迟实例化,在iOS里经常用到        return _operandStack; }                                                     //没有用setter,因为没有特殊的事情要做 -(double)popOperand {         NSNumber *operandObject=[self.operandStack lastObject];         //NSMutableArray的实例方法lastObject。                                                             //lastObject是数组最后一个对象的指针而不是一个副本             if (operandObject)      //如果对空数组做移除操作,不是nil是空,程序会崩溃 。前面的lastObject不会崩溃但removeLastObject会崩溃           
[self.operandStack removeLastObject];
//NSMutableArray的实例方法removeLastObject return [operandObject doubleValue]; //NSNumber解封(开箱unboxing)doubleValue。 } -(void)pushOperand:(double)operand { [self.operandStack addObject:[NSNumber numberWithDouble:operand]]; //NSNumber封装(装箱boxing)numberWithDouble及NSMutableArray的实例方法addObject。 // 如果property创建operandStack的值为nil,此步什么也不发生。 //为了避免此情况,要用构造函数设置operandStack,本例这个设置在getter里执行。 } -(double)performOperation:(NSString *)operation { double result=0; double numB = [self popOperand]; double numA = [self popOperand]; if ([operation isEqualToString:@"+"]) //NSString的实例方法isEqualToString { result=numA+numB; } else if([@"*" isEqualToString:operation]) { result=numA*numB;} else if([@"-" isEqualToString:operation]) { result=numA-numB;} else if([@"/" isEqualToString:operation] && numB!=0) { result=numA/numB; } [self pushOperand:result]; //把结果压回到栈上,因为要继续操作 return result; }@end

 

[Stanford] RPN Calculator(model)