前言
Day04介绍了Reverse Polish Notation,主要是为了方便用栈这个结构计算数学表达式。复习下:
输入前:(3 + 2)*(4 + 6)转化后:3 2 + 4 6 + *结果:50
流程图
主要代码
-
- (int)evaluateRPN
NSString *)inputStr
-
{
-
DSStack *newStack = [[DSStack alloc] initWithSize:10];
-
for (int i =0 ; i<inputStr.length; i++)
-
{
-
unichar tempChar = [inputStr characterAtIndex:i];
-
if ([[NSString stringWithCharacters:&tempChar length:1] isEqualToString:@"*"])
-
{
-
NSNumber *a = [newStack popLastObject];
-
NSNumber *b = [newStack popLastObject];
-
[newStack push:[NSNumber numberWithInt:([a intValue]*[b intValue])]];
-
}
-
else if ([[NSString stringWithCharacters:&tempChar length:1] isEqualToString:@"/"])
-
{
-
NSNumber *a = [newStack popLastObject];
-
NSNumber *b = [newStack popLastObject];
-
[newStack push:[NSNumber numberWithInt:([a intValue]/[b intValue])]];
-
}
-
else if ([[NSString stringWithCharacters:&tempChar length:1] isEqualToString:@"+"])
-
{
-
NSNumber *a = [newStack popLastObject];
-
NSNumber *b = [newStack popLastObject];
-
[newStack push:[NSNumber numberWithInt:([a intValue]+[b intValue])]];
-
}
-
else if ([[NSString stringWithCharacters:&tempChar length:1] isEqualToString:@"-"])
-
{
-
NSNumber *a = [newStack popLastObject];
-
NSNumber *b = [newStack popLastObject];
-
[newStack push:[NSNumber numberWithInt:([a intValue]-[b intValue])]];
-
}
-
else
-
{
-
-
[newStack push:[NSNumber numberWithInt:[[NSString stringWithCharacters:&tempChar length:1] intValue]]];
-
}
-
-
}
-
return [[newStack popLastObject] intValue];
-
-
}
大致思路描述
-
把中缀表达式转化为Reverse Polish Notation。
-
按照顺序进栈。
-
当进栈的元素是 ( + – * / )四个运算符,则弹出栈顶两个元素并计算,并且把结果入栈。
-
最终栈只剩下一个元素,这个元素就是最后的值。
-
100天iOS数据结构与算法实战 Day01
-
100天iOS数据结构与算法实战 Day02 – 栈
-
100天iOS数据结构与算法实战 Day03 – 栈的算法实战 Valid Parentheses
-
100天iOS数据结构与算法实战 Day04 – 栈的算法实战 逆波兰表示法
References
交流群昵称:ios-Swift/Object C开发上架
交流群号: 869685378 找ios马甲包开发者合作,有兴趣请添加Q 51259559