PTA 5-21 求前缀表达式的值(25)- 线性表

题目:http://pta.patest.cn/pta/test/15/exam/4/question/836

PTA - 数据结构与算法(中文) - 5-21

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,例如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

输入格式说明:

输入在一行内给出不超过30个字符的前缀表达式,只包含+、-、*、以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

输出格式说明:

输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。

样例输入与输出:

image

#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
double exp() //!返回前缀表达式的值
{
    char a[10]; //!用于存储第一个非空格字符
    cin >> a;
    if(!a[1])
    {   //!a[1]为空,只有一位,即运算符或者数字0-9
        switch(a[0])
        { 
            //!递归
            case '+': return exp() + exp();
            case '-': return exp() - exp();
            case '*': return exp() * exp();
            case '/':
               {
                    double fenzi=exp();
                    double fenmu=exp();
                    if(fenmu!=0)
                        return fenzi / fenmu;
                    else{
                        cout << "ERROR";
                        exit(0);        //!程序结束
                    }
                }
            default : return atof(a);   //!将字符串转化成浮点数
        }
    }
    else
    {    //!a[1]不为空,不是运算符,是操作数
        if(a[0]=='-' || a[0]=='+')      //!带符号的数
        {
            char flag=a[0]; //!记录符号
            int i=0;
            while(a[i]){    //!覆盖符号
                a[i]=a[i+1];
                i++;
            }
            if(flag=='-')
                return 0-atof(a);
            else
                return atof(a);
        }
        else                            //!不带符号的数
            return atof(a);
    }
}
int main()
{
    printf("%.1f",exp());   //!保留一位小数
    return 0;
}
原文地址:https://www.cnblogs.com/claremore/p/4803869.html