3

我正在尝试制作一个 RPN 计算器程序,并希望有一个标签来显示您输入的表达式。如果您输入 3,5,4,+,/,标签将显示 ((4+5) / 3)。我在实现这一点时遇到了麻烦。我正在使用一个 mutableArray,我称之为堆栈,它同时包含数字和操作数。另一个主要问题是传递的字符串不会是一个完整的字符串,而是每次用户输入一个值时都会传递它,因此程序必须在堆栈上只有一个或两个项目的情况下连续运行。这是代码。

   + (NSString *)descriptionOfProgram:(id)program
{
NSMutableArray *stack;

if([NSArray isKindOfClass:[NSArray class]])
    stack = [program mutableCopy];

NSUInteger count = [stack count];
NSString* symbol;
NSMutableString *result;
[result appendString:@"("];



for( NSUInteger i=0; i<count; i++){



    if ([[stack lastObject] isEqualToString:@"+"] || [[stack lastObject] isEqualToString:@"-"] ||  [[stack lastObject] isEqualToString:@"/"] ||  [[stack lastObject] isEqualToString:@"*"] ||  [[stack lastObject] isEqualToString:@"sin"] || [[stack lastObject] isEqualToString:@"cos"] )
        {
            symbol = [stack lastObject];
            [stack removeLastObject];

        }
    else
        {


            if( [stack lastObject] != nil){
                [result appendString:[stack lastObject]];
                [stack removeLastObject]; }


         // [result stringByAppendingString:symbol];


            if( [stack lastObject]){
            [result appendString:[stack lastObject]];
                [stack removeLastObject];}


            [result appendString:@")"];

            [stack addObject:result];
        }
}

return [stack lastObject];


}
4

1 回答 1

1

代码中的一个主要问题是您对stringByAppendingString: 的使用,因为NSString它是不可变的,所以代码应该将从方法返回的结果分配给原始字符串,如下所示:

result = [result stringByAppendingString:[stack lastObject]];

当您需要动态连接多个字符串时,更好的方法是使用NSMutableString. 这是一个子类,NSString它允许您附加其他字符串,如下所示:

[result appendString:[stack lastObject]];

您可以使用该stringWithFormat:方法完全避免附加字符串。

以程序的内容开始堆栈也不是正确的做法:您应该program一个一个地遍历符号,压入数字,并通过弹出最后两个项目来处理操作,在左右两侧插入操作,在其周围添加括号,并将其推回堆栈。

+ (NSString *)descriptionOfProgram:(NSArray*)program {
    NSArray *ops = [NSArray arrayWithObjects:@"+",@"-",@"*",@"/",@"sin",@"cos",nil];
    NSMutableArray *stack = [NSMutableArray array];
    for (NSString *s in program) {
        if ([ops indexOfObject:s] != NSNotFound) {
            NSString *lhs = [stack lastObject];
            [stack removeLastObject];
            NSString *rhs = [stack lastObject];
            [stack removeLastObject];
            [stack addObject:[NSString stringWithFormat:@"(%@ %@ %@)", lhs, s, rhs]];
        } else {
            [stack addObject:s];
        }
    }
    return [stack lastObject];
}
于 2012-07-14T00:40:19.730 回答