OC逆波兰表达式

逆波兰表达式又叫做后缀表达式,特点是先把数字放在前面,运算符号放在后面,数字都是整数,比如:["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

你可能感兴趣的:(OC逆波兰表达式)