美文网首页
OC逆波兰表达式

OC逆波兰表达式

作者: 引擎雪 | 来源:发表于2020-07-18 09:30 被阅读0次

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

          本文链接:https://www.haomeiwen.com/subject/lyrxkktx.html