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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM