zoukankan      html  css  js  c++  java
  • 一本通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;
    }

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

  • 相关阅读:
    白鸦:互联网就是社区,液态的社区
    「芭比娃娃.com」
    做几个经营「人」的小网站,速速卖给大公司?
    关于工作与生活来自前hp总裁孙振耀
    新网站上线,酷狗狗 www.coogogo.com
    中国地摊联盟群组
    discuz!nt论坛搬迁后出错,提示:对象名 'dnt_templates' 无效
    时光.旅人
    const和readonly
    html.partial的一个bug?
  • 原文地址:https://www.cnblogs.com/57xmz/p/12601310.html
Copyright © 2011-2022 走看看