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

150 阅读2分钟
原文链接: mp.weixin.qq.com

当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放 Lucky Lenka - Lucky

题目描述:

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

我们主要用他来做什么

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

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

上述例子的示意图

步骤一步骤二 步骤三 步骤四 步骤五

步骤六

步骤七步骤八 步骤九 步骤十 步骤十一

主要代码

    - (NSString *)infixToPostfix:(NSString *)inputStr

    {

    //1

    NSMutableString *resultsStr = [@"" mutableCopy];

    //2

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

    //3

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

    {

    unichar tempChar = [inputStr characterAtIndex:i];

    //4

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

    {

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

    }

    //5

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

    {

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

    }

    //6

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

    {

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

    {

    [resultsStr appendString:[newStack popLastObject]];

    }

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

    {

    return @"无效的表达式";

    }

    else

    {

    [newStack popLastObject];

    }

    }

    //7

    else

    {

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

    {

    [resultsStr appendString:[newStack popLastObject]];

    }

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

    }

    }

    //8

    while ([newStack sizeOfStack] > 0)

    {

    [resultsStr appendString:[newStack popLastObject]];

    }

    return resultsStr;

    }

代码思路描述

  1. 初始化一个空字符串

  2. 初始化一个空栈

  3. 读取遍历每个字符

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

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

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

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

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

代码链接

GithubDemo [2]

关注公众号最新动态

References

[1] 逆波兰记法: https://zh.wikipedia.org/wiki/%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E7%A4%BA%E6%B3%95 [2] GithubDemo: https://github.com/renmoqiqi/100-Days-Of-iOS-DataStructure-Algorithm/tree/master/Day04