• 逆波兰表达式


    逆波兰表达式是一种把运算符前置的算术表达式(其实一般教科书上称这种表达式为波兰表达式),例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰 表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如 (2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符 包括+ - * /四个。
    输入
    输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点 数
    输出 输出为一行,表达式的值。

    样例输入 * + 11.0 12.0 + 24.0 35.0

    样例输出 1357.000000

    提示:(11.0+12.0)*(24.0+35.0)

    声明:

    本题中的逆波兰表达式实际上是波兰表达式

    其定义:

    (1):一个数是逆波兰表达式,值为该数

    (2): "运算符  逆波兰表达式  逆波兰表达式"是逆波兰表达式,值为逆波兰表达式的值运算结果

    代码说明:

    每次调用exp函数的时候,读入一个逆波兰表达式,此时不会调用其它的case语句,所以也就不用写break,然后在一个case中递归调用exp,再次读入一个子逆波兰表达式,一直到子逆波兰表达式的值为两个数的时候,递归结束,整个函数的值返回。

    像是例题中的表达式,就要向 * 号的递归中返回两次,因为调用了两次exp函数。

    对于cin的理解,对于cin来说,结束标志位空格、Tap和enter,所以每次从数据缓冲区读入的时候,都会读入空格然后结束,因为本题中是输入空格的。

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    using namespace std;
    
    double exp()
    {
        char s[20];
        cin >> s;
        switch (s[0])
        {
            case '+':
                return exp() + exp();
            case '-':
                return exp() - exp();
            case '*':
                return exp() * exp();
            case '/':
                return exp() / exp();
            default:
                return atof(s);
                break;
        }
    }
    
    int main()
    {
        printf("%lf
    ", exp());
        getchar();
        getchar();
        return 0;
    }
  • 相关阅读:
    [算法] 网络中最小费用最大流
    [题解] 完美数
    [算法] 扫描线及其应用
    等待时间
    键盘操作
    鼠标操作
    元素常用操作
    元素的定位·CSS
    元素的定位·XPATH
    元素的定位
  • 原文地址:https://www.cnblogs.com/xyqxyq/p/10211375.html
Copyright © 2020-2023  润新知