后缀到中缀转换器目标C.

时间:2012-07-14 00:31:08

标签: objective-c xcode arrays infix-notation postfix-notation

我正在尝试制作一个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];


}

1 个答案:

答案 0 :(得分: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];
}