逆波兰表达式又叫做后缀表达式,特点是先把数字放在前面,运算符号放在后面,数字都是整数,比如:["4", "13", "5", "/", "+"] 计算方法是4+13/5 = 6;
该题目在力扣是第150题,地址是 https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
下面介绍用oc改怎么做这道题,由于oc不能像java一样有Stack这个对象,所以只能通过array来实现。
原理
利用栈的push 与pop原理,把遍历到的数字push到栈中,当遇到运算符的时候,pop出最后两个进行计算,把最新的值push到栈中,如此循环直到结束。注意:pop出来的数字,第一个是运算符右边的数字,第二个是运算符左边的数字,在做减法和乘法是这个顺序不能乱。好,现在上代码
代码
一,创建一个类 PolishReverse
#import PolishReverse : NSObject
NS_ASSUME_NONNULL_BEGIN
@interface PolishReverse : NSObject
- initWithPolishArray:(NSArray *)array;
//最后计算的结果
- (NSInteger)getResult;
@end
#import "PolishReverse.h"
@interface PolishReverse ()
/**存放数字的数组*/
@property (nonatomic ,strong) NSMutableArray *stack;
@end
@implementation PolishReverse
- initWithPolishArray:(NSArray *)array{
if(self = [super init]) {
[self operatorArray:array];
}
return self;
}
- (void)operatorArray:(NSArray*)array{
self.stack = [NSMutableArray array];
for(NSString*strinarray) {
if([str isEqualToString:@"+"]) {
[self push:[self pop]+[self pop]];
}else if([str isEqualToString:@"-"]) {
[self push:-[self pop]+[self pop]];
}else if([str isEqualToString:@"*"]) {
[self push:[self pop]*[self pop]];
}else if([str isEqualToString:@"/"]) {
NSInteger right = [self pop];
[self push:[self pop]/right];
}else{
NSInteger num = [str integerValue];
[self push:num];
}
}
}
- (void)push:(NSInteger)number{
[self.stackaddObject:@(number)];
}
- (NSInteger)pop{
NSInteger lastNum = [self.stack.lastObject integerValue];
[self.stack removeLastObject];
returnlastNum;
}
- (NSInteger)getResult{
return [self.stack.lastObject integerValue];
}
@end
二,调用
#import "ViewController.h"
#import "PolishReverse.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
PolishReverse *p = [[PolishReverse alloc] initWithPolishArray:@[@"4", @"13", @"5", @"/", @"+"]];
NSLog(@"%ld",[p getResult]);
}
@end