1. 程式人生 > >7-21 求字首表示式的值(二叉樹)

7-21 求字首表示式的值(二叉樹)

算術表示式有字首表示法、中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如2+3*(7-4)+8/4的字首表示式是:+ + 2 * 3 - 7 4 / 8 4。請設計程式計算字首表示式的結果值。

輸入格式:

輸入在一行內給出不超過30個字元的字首表示式,只包含+、-、*、\以及運算數,不同物件(運算數、運算子號)之間以空格分隔。

輸出格式:

輸出字首表示式的運算結果,保留小數點後1位,或錯誤資訊ERROR。

輸入樣例:

+ + 2 * 3 - 7 4 / 8 4

輸出樣例:

13.0

用二叉樹的思路很好想,就是資料處理有點麻煩,我的程式碼雖然PTA的測試樣例通過了,但我估計還有其他的樣例有一些錯誤,,下次還是老老實實的用棧模擬吧。。

#include <bits/stdc++.h>
using namespace std;

typedef char ElementType;
typedef struct TNode *BTree;
struct TNode{
    BTree Left;
    BTree Right;
    double num;
};
int f=0,k=0;
string s;
double BuildTree(BTree t){
    t=(BTree)malloc(sizeof(BTree));
    char c;
    if(k>=s.length()){
        f=
1; return 0; } c=s[k++]; if(c-'0'>=0&&c-'0'<=9){ double sum; sum=c-'0'; int isdecimals=0,cnt=10; while(1){ c=s[k++]; if(c=='.'){ isdecimals=1; continue; } if(c<
'0')break; if(!isdecimals)sum=sum*10+c-'0'; else { sum=sum+(c-'0')*1.0/cnt; cnt*=10; } } return sum; } else if(c<'0'&&s[k]-'0'>=0&&s[k]-'0'<=9){ double sum=0; char q=c; int isdecimals=0,cnt=10; while(1){ c=s[k++]; if(c=='.'){ isdecimals=1; continue; } if(c<'0')break; if(!isdecimals)sum=sum*10+c-'0'; else { sum=sum+(c-'0')*1.0/cnt; cnt*=10; } } if(q=='-')return -sum; else return sum; } k++; double a=BuildTree(t->Left); double b=BuildTree(t->Right); if(c=='+'){ t->num=a+b; } else if(c=='-'){ t->num=a-b; } else if(c=='*'){ t->num=a*b; } else if(c=='/'){ if(b==0){ f=1; return 0; } t->num=a/b; } return t->num; } int main(){ BTree t; getline(cin,s); double sum=BuildTree(t); if(f==1)cout<<"ERROR"<<endl; else printf("%.1lf",sum); }