有部分改进,
更改了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
其他文件不变。