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