将后缀表达式转换为中缀表达式 Objective C。

3
我正在尝试制作一个逆波兰计算器程序,并希望有一个标签显示您输入的表达式。如果您输入3,5,4,+,/,则标签将显示((4+5) / 3)。我在实现时遇到了困难。我使用一个名为stack的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个回答

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];
}

我已经修改了上面的内容,感谢您指出,但程序仍然无法正常工作。 - Terrel Gibson
@TerrelGibson,你能更新一下你的程序最新版本的问题吗? - Sergey Kalinichenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接