逆波蘭表達(dá)式又叫做后綴表達(dá)式,特點(diǎn)是先把數(shù)字放在前面,運(yùn)算符號放在后面焰枢,數(shù)字都是整數(shù),比如:["4", "13", "5", "/", "+"] 計(jì)算方法是4+13/5 = 6;
該題目在力扣是第150題舌剂,地址是 https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
下面介紹用oc改怎么做這道題济锄,由于oc不能像java一樣有Stack這個對象,所以只能通過array來實(shí)現(xiàn)霍转。
原理
利用棧的push 與pop原理荐绝,把遍歷到的數(shù)字push到棧中,當(dāng)遇到運(yùn)算符的時候避消,pop出最后兩個進(jìn)行計(jì)算低滩,把最新的值push到棧中,如此循環(huán)直到結(jié)束岩喷。注意:pop出來的數(shù)字委造,第一個是運(yùn)算符右邊的數(shù)字,第二個是運(yùn)算符左邊的數(shù)字均驶,在做減法和乘法是這個順序不能亂昏兆。好,現(xiàn)在上代碼
代碼
一,創(chuàng)建一個類 PolishReverse
#import PolishReverse : NSObject
NS_ASSUME_NONNULL_BEGIN
@interface PolishReverse : NSObject
- initWithPolishArray:(NSArray *)array;
//最后計(jì)算的結(jié)果
- (NSInteger)getResult;
@end
#import "PolishReverse.h"
@interface PolishReverse ()
/**存放數(shù)字的數(shù)組*/
@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
二爬虱,調(diào)用
#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