美文网首页
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

相关文章

  • 递归-逆波兰表达式

    逆波兰表达式定义 (1)一个数是一个逆波兰表达式,值为该数(2)"运算符 逆波兰表达式 逆波兰表达式 "是逆波兰表...

  • 《每周一道算法题》(一)逆波兰表达式求值

    一 逆波兰表达式求值 150. 逆波兰表达式求值 说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换...

  • iOS算法题(一)逆波兰表达式求值

    一 逆波兰表达式求值 150. 逆波兰表达式求值 说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换...

  • LeetCode-150-逆波兰表达式求值

    LeetCode-150-逆波兰表达式求值 150. 逆波兰表达式求值[https://leetcode-cn.c...

  • ARTS第七周20200705

    Algorithm 逆波兰表达式求值 根据 逆波兰表示法,求表达式的值。 有效的运算符包括 +, -, *, / ...

  • OC逆波兰表达式

    逆波兰表达式又叫做后缀表达式,特点是先把数字放在前面,运算符号放在后面,数字都是整数,比如:["4", "13",...

  • 编译原理系列之九 中间代码生成

    中间代码生成 中间代码也与机器无关。 常见中间表示形式:逆波兰式:逆波兰式中缀表达式转逆波兰式:按照算术表达式的计...

  • 波兰式&逆波兰式

    波兰式 又称为先序表达式,前缀表达式 逆波兰式 又称为后序表达式,后缀表达式

  • 逆波兰表达式求值

    1.什么是逆波兰表达式?也叫后缀表达式,(3+4)*5-6 对应的逆波兰表达式 3 4 + 5 * 6 - 2....

  • LeetCode-150- 逆波兰表达式求值

    逆波兰表达式求值 题目描述:根据 逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是...

网友评论

      本文标题:OC逆波兰表达式

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