• 一本通1198 逆波兰表达式


    【题目描述】

    逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。

    【输入】

    输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。

    【输出】

    输出为一行,表达式的值。

    可直接用printf("%f ", v)输出表达式的值v。

    【输入样例】

    * + 11.0 12.0 + 24.0 35.0

    【输出样例】

    1357.000000


    代码:


    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    char a[101];
    double ni()
    {
    scanf("%s",a);
    if(a[0]=='+')
    return ni()+ni();
    if(a[0]=='-')
    return ni()-ni();
    if(a[0]=='*')
    return ni()*ni();
    if(a[0]=='/')
    return ni()/ni();
    else
    return atof(a);
    }
    int main()
    {
    printf("%f ",ni());
    return 0;
    }

    代码非常短,我写这个题主要是因为思路非常巧妙。不再细致到每一句注释,直接捋思路。这个代码的思路大致就是,
    如果你输入的是一个运算符,那么就要再输入两个数来完成一次运算,这个巧妙的递归就是用了这个原理,如果你输入
    一个运算符,那么就要再输入两次。如果还是运算符,那么继续递归。知道把所有的运算符都“消耗完”,那么就根据
    各自的运算符进行加减乘除。打个比方,一个运算符是一个根,一个数字就是一片叶子。叶子底下不能结叶子和根,
    当它成为一片叶子也就是一个数字时,就停止递归。反之,根可以一直生根,除非长出叶子。

  • 相关阅读:
    xcode8.3 shell 自动打包脚本
    MarkDown常用语法记录
    正则表达式matcher.group()用法
    使用Jenkins进行持续集成
    Java8新特性:Stream的使用
    zookeeper windows 下配置和基础命令
    JAVA文件中获取路径及WEB应用程序获取路径方法
    共享锁(S锁)和排它锁(X锁)
    zookeeper 官方文档——综述
    zookeeper 入门指导
  • 原文地址:https://www.cnblogs.com/57xmz/p/12601310.html
Copyright © 2020-2023  润新知