7-21 求字首表示式的值(二叉樹)
阿新 • • 發佈:2018-12-19
算術表示式有字首表示法、中綴表示法和字尾表示法等形式。字首表示式指二元運算子位於兩個運算數之前,例如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);
}