gpt4 book ai didi

objective-c - 后缀到中缀转换器 Objective C

转载 作者:搜寻专家 更新时间:2023-10-30 20:25:59 26 4
gpt4 key购买 nike

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


}

最佳答案

您的代码中的一个主要问题是您对 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];
}

关于objective-c - 后缀到中缀转换器 Objective C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11479963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com