100天iOS数据结构与算法实战 Day04 – 栈的算法实战 逆波兰表示法

题目描述:

输入前:(3 + 2)*(4 + 6)转化后:3 2 + 4 6 + *

我们主要用他来做什么

在1960和1970年代,逆波兰记法[1]  广泛地被用于台式计算器,因此也在普通公众(工程、商业和金融领域)中使用。

后面我们一个类似计算器的算法题和这个有关,所以我们先看看这个吧。

上述例子的示意图

步骤一

步骤二

步骤三

步骤四

步骤五

步骤六

步骤七

步骤八

步骤九

步骤十

步骤十一

主要代码

 
  1. - (NSString *)infixToPostfix?NSString *)inputStr

  2. {

  3. //1

  4.    NSMutableString *resultsStr = [@"" mutableCopy];

  5.    //2

  6.    DSStack *newStack = [[DSStack alloc] initWithSize:10];

  7.    //3

  8.    for (int i =0 ; i<inputStr.length; i++)

  9.    {

  10.        unichar tempChar = [inputStr characterAtIndex:i];

  11.        //4

  12.        if ([self inputShouldNumber:[NSString stringWithCharacters:&tempChar length:1]])

  13.        {

  14.            [resultsStr appendString:[NSString stringWithCharacters:&tempChar length:1]];

  15.        }

  16.        //5

  17.        else if ([[NSString stringWithCharacters:&tempChar length:1] isEqualToString:@"("])

  18.        {

  19.            [newStack push:[NSString stringWithCharacters:&tempChar length:1]];

  20.        }

  21.        //6

  22.        else if ([[NSString stringWithCharacters:&tempChar length:1] isEqualToString:@")"])

  23.        {

  24.            while ([newStack sizeOfStack] > 0 && ![[newStack peek] isEqualToString:@"("])

  25.            {

  26.                [resultsStr appendString:[newStack popLastObject]];

  27.            }

  28.  

  29.            if ([newStack sizeOfStack] > 0 && ![[newStack peek] isEqualToString:@"("])

  30.            {

  31.                return @"无效的表达式";

  32.            }

  33.            else

  34.            {

  35.                [newStack popLastObject];

  36.            }

  37.  

  38.        }

  39.        //7

  40.        else

  41.        {

  42.            while ([newStack sizeOfStack] > 0 && [self operatorOfPriority:[NSString stringWithCharacters:&tempChar length:1]] <= [self operatorOfPriority:[newStack peek]])

  43.            {

  44.                [resultsStr appendString:[newStack popLastObject]];

  45.            }

  46.            [newStack push:[NSString stringWithCharacters:&tempChar length:1]];

  47.        }

  48.    }

  49.    //8

  50.    while ([newStack sizeOfStack] > 0)

  51.    {

  52.        [resultsStr appendString:[newStack popLastObject]];

  53.  

  54.    }

  55.  

  56.    return resultsStr;

  57. }

代码思路描述

  1. 初始化一个空字符串

  2. 初始化一个空栈

  3. 读取遍历每个字符

  4. 如果读取的字符是数字,则拼接

  5. 如果读取的字符是‘(’,则进栈

  6. 如果读取的字符是‘)’,先把‘(’ 之前的出栈并拼接,然后这个‘(’ 再 出栈

  7. 如果读取的是 + ,-,,/。如果栈非空并且这个( + ,-,,/ )优先级小于等于栈顶的元素的优先级,遍历出栈并拼接,否则进栈

  8. 把剩下的元素一一出栈并拼接

代码链接

GithubDemo[2]

交流群昵称:ios-Swift/Object C开发上架
交流群号: 869685378   找ios马甲包开发者合作,有兴趣请添加Q 51259559

  • 100天iOS数据结构与算法实战 Day01

  • 100天iOS数据结构与算法实战 Day02 – 栈

  • 100天iOS数据结构与算法实战 Day03 – 栈的算法实战 Valid Parentheses  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值