【问题标题】:Postfix to infix converter Objective C后缀到中缀转换器目标 C
【发布时间】:2013-01-19 04:36:42
【问题描述】:

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


}

【问题讨论】:

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


    【解决方案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];
    }
    

    【讨论】:

    • 我更改了上面的内容,感谢您指出,但程序仍然无法运行
    • @TerrelGibson 你能用你的程序的最新版本更新这个问题吗?
    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2015-02-19
    • 2016-06-25
    • 1970-01-01
    • 2013-07-12
    相关资源
    最近更新 更多