iOS - 斯坦福CS193P 2011秋季课程,作业2 descriptionOfProgram问题

时间:2012-02-03 19:46:03

标签: ios recursion nsstring nsmutablearray cs193p

此作业的一部分包括在显示屏上打印出要解决的当前等式,为此我使用以下方法:

+ (NSString *)descriptionOfTopOfStack:(NSMutableArray *)stack {
    NSMutableString *programFragment = [NSMutableString stringWithString:@""];

    id topOfStack = [stack lastObject];
    if (topOfStack) [stack removeLastObject];

    if ([topOfStack isKindOfClass:[NSNumber class]]) {
        [programFragment appendFormat:@"%g", [topOfStack doubleValue]];
    } else if ([topOfStack isKindOfClass:[NSString class]]) {
        NSString *operation = topOfStack;
        if ([self isDoubleOperandOperation:operation]) {
            [programFragment appendFormat:@"(%@ %@ %@)", [self descriptionOfTopOfStack:stack], operation, [self descriptionOfTopOfStack:stack]];
        } else if ([self isSingleOperandOperation:operation]) {
            [programFragment appendFormat:@"%@( %@ )", operation, [self descriptionOfTopOfStack:stack]];
        } else if ([ self isNoOperandOperation:operation]) {
            [programFragment appendFormat:@"%@", operation];
        } else if ([self isVariable:operation]) {
            [programFragment appendFormat:@"%@", operation];
        }
    }

    return programFragment;
}

+ (NSString *)descriptionOfProgram:(id)program {
    NSMutableArray *stack;
    if ([program isKindOfClass:[NSArray class]]) {
        stack = [program mutableCopy];
    }

    return [self descriptionOfTopOfStack:stack];
}

我的程序计算结果,一切都很好,唯一的问题是当我输入一个变量,数字或单个操作数操作时,显示只显示最后一个条目,因为它不会继续迭代其余的数组中存在的值,因为没有进行其他递归调用,任何想法如何使程序在整个堆栈中执行而不是让它破坏输出?

4 个答案:

答案 0 :(得分:2)

我不太清楚你的意思。递归应该停止在变量,数字或单个操作数操作。虽然对于sin(操作数)操作,它应该继续操作数。

您是否考虑过您的堆栈可能未完全定义?

假设您输入:3输入5 + 6输入7 * 9 sqrt

这应该转换为:3 + 5,6,sqrt(7 * 9)

所以你的堆栈上仍有三个元素,但你的方法在sqrt(7 * 9)停止。

您需要添加一个检查以查看堆栈上是否还有任何内容,并在必要时继续(并添加逗号)。

答案 1 :(得分:1)

好的,然后另一个提示(最后添加):

if ([stack count]) {    // did I finish the entire stack?
   [programFragment appendFormat:@"%@, %@", [self describeStack:stack], programFragment];
}

答案 2 :(得分:1)

有趣的是,您使用了NSMutableString,我使用NSString并使用类方法stringWithFormat。所以每次我的结果都是一个新的字符串。我不知道两种方法是否更好。

答案 3 :(得分:0)

aleene已经回答了,但只是澄清一下。我在调用递归函数的方法中添加了[堆栈计数]检查。

+ (NSString *)descriptionOfProgram:(id)program {
        NSMutableArray *stack;
        NSString *strDesc = @"";

        if ([program isKindOfClass:[NSArray class]]) {
            // Make a consumable, mutable copy:
            stack = [program mutableCopy];
        }

        while (stack.count) {
            strDesc = [strDesc stringByAppendingString:[self descriptionOfTopOfStack:stack]];
            if (stack.count) {
                // More statements still on stack. We will loop again, but first, append comma separator:
                strDesc = [strDesc stringByAppendingString:@", "];
            }
        }

        return strDesc;
    }