此作业的一部分包括在显示屏上打印出要解决的当前等式,为此我使用以下方法:
+ (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];
}
我的程序计算结果,一切都很好,唯一的问题是当我输入一个变量,数字或单个操作数操作时,显示只显示最后一个条目,因为它不会继续迭代其余的数组中存在的值,因为没有进行其他递归调用,任何想法如何使程序在整个堆栈中执行而不是让它破坏输出?
答案 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)
+ (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;
}