逻辑:
1.遇到数字,添加进最后的postfix字符串中
2.遇到运算符
①stack的最后一位是左括号或者最后一位运算符的优先级低于该运算符,运算符入栈
②如果不符合上一条条件,将栈内最后的元素出栈并添加进postfix中,直到符合为止,然后将该运算符入栈
3.左括号直接入栈
4.碰到右括号将栈内依次出栈,添加进postfix直到遇到左括号,然后丢掉左括号
5.栈内还有剩余依次出栈,添加进postfix
+(NSArray *)infixToPostfix:(NSArray *)infix{
NSMutableArray *postfix = [NSMutableArray array];
NSDictionary *operates = @{@"*":@"1",@"/":@"1",@"+":@"0",@"-":@"0"};
NSMutableArray *stacks = [NSMutableArray array];
for(NSString *str in infix){
//NSLog(@"str:%@",str);
if(![operates.allKeys containsObject:str] && ![str isEqualToString:@"("] && ![str isEqualToString:@")"]){
[postfix addObject:str];
}else if([operates.allKeys containsObject:str]){
if(stacks.count){
while (![stacks.lastObject isEqualToString:@"("] && operates[stacks.lastObject] >= operates[str]) {
[postfix addObject:stacks.lastObject];
[stacks removeLastObject];
}
[stacks addObject:str];
}else{
[stacks addObject:str];
}
}else if ([str isEqualToString:@"("]){
[stacks addObject:str];
}else if ([str isEqualToString:@")"]){
if(stacks.count == 0){
NSLog(@"error");
return nil;
}
while (![stacks.lastObject isEqualToString:@"("]) {
[postfix addObject:stacks.lastObject];
[stacks removeLastObject];
}
if(![stacks.lastObject isEqualToString:@"("]){
NSLog(@"error");
return nil;
}
[stacks removeLastObject];
}
}
while(stacks.count > 0){
[postfix addObject:stacks.lastObject];
[stacks removeLastObject];
}
return postfix;
}