逆波兰表达式

逆波兰表达式是一种把运算符前置的算术表达式(其实一般教科书上称这种表达式为波兰表达式),例如普通的表达式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;
}
原文地址:https://www.cnblogs.com/xyqxyq/p/10211375.html