输入前:(3 + 2)*(4 + 6) 转化后:3 2 + 4 6 + *
在1960和1970年代,逆波兰记法[1] 广泛地被用于台式计算器,因此也在普通公众(工程、商业和金融领域)中使用。
后面我们一个类似计算器的算法题和这个有关,所以我们先看看这个吧。
步骤一步骤二
步骤三
步骤四
步骤五
步骤六
步骤七步骤八
步骤九
步骤十
步骤十一
- (NSString *)infixToPostfix:(NSString *)inputStr
{
//1
NSMutableString *resultsStr = [@"" mutableCopy];
//2
DSStack *newStack = [[DSStack alloc] initWithSize:10];
//3
for (int i =0 ; i<inputStr.length; i++)
{
unichar tempChar = [inputStr characterAtIndex:i];
//4
if ([self inputShouldNumber:[NSString stringWithCharacters:&tempChar length:1]])
{
[resultsStr appendString:[NSString stringWithCharacters:&tempChar length:1]];
}
//5
else if ([[NSString stringWithCharacters:&tempChar length:1] isEqualToString:@"("])
{
[newStack push:[NSString stringWithCharacters:&tempChar length:1]];
}
//6
else if ([[NSString stringWithCharacters:&tempChar length:1] isEqualToString:@")"])
{
while ([newStack sizeOfStack] > 0 && ![[newStack peek] isEqualToString:@"("])
{
[resultsStr appendString:[newStack popLastObject]];
}
if ([newStack sizeOfStack] > 0 && ![[newStack peek] isEqualToString:@"("])
{
return @"无效的表达式";
}
else
{
[newStack popLastObject];
}
}
//7
else
{
while ([newStack sizeOfStack] > 0 && [self operatorOfPriority:[NSString stringWithCharacters:&tempChar length:1]] <= [self operatorOfPriority:[newStack peek]])
{
[resultsStr appendString:[newStack popLastObject]];
}
[newStack push:[NSString stringWithCharacters:&tempChar length:1]];
}
}
//8
while ([newStack sizeOfStack] > 0)
{
[resultsStr appendString:[newStack popLastObject]];
}
return resultsStr;
}
初始化一个空字符串
初始化一个空栈
读取遍历每个字符
如果读取的字符是数字,则拼接
如果读取的字符是‘(’,则进栈
如果读取的字符是‘)’,先把‘(’ 之前的出栈并拼接,然后这个‘(’ 再 出栈
如果读取的是 + ,-,,/。如果栈非空并且这个( + ,-,,/ )优先级小于等于栈顶的元素的优先级,遍历出栈并拼接,否则进栈
把剩下的元素一一出栈并拼接
GithubDemo[2]
关注公众号最新动态
References
[1]
逆波兰记法: https://zh.wikipedia.org/wiki/%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E7%A4%BA%E6%B3%95[2]
GithubDemo: https://github.com/renmoqiqi/100-Days-Of-iOS-DataStructure-Algorithm/tree/master/Day04