1

该任务的一部分包括在显示屏上打印出当前要求解的方程,为此我使用以下方法:

+ (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

4 回答 4

2

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

您是否考虑到您的堆栈可能没有完全定义?

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

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

因此,您的堆栈中仍有三个元素,但您的方法在 sqrt(7*9) 处停止。

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

于 2012-02-03T22:45:40.327 回答
1

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

于 2012-02-04T16:18:27.333 回答
1

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

if ([stack count]) {    // did I finish the entire stack?
   [programFragment appendFormat:@"%@, %@", [self describeStack:stack], programFragment];
}
于 2012-02-04T07:25:39.633 回答
0

aleene 已经回答了,但只是为了澄清。我在调用递归函数的方法中添加了 [stack count] 检查。

+ (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;
    }
于 2012-03-25T00:29:34.420 回答