题目描述
读入表达式树的先序遍历字符串,求其值。运算符只可能是加减乘除,保证输入的每个子表达式树的结果都是整数值且可以用C语言的int类型表达。
输入
输入由多组测试数据组成。
每组数据包含一行字符串,即表达式树的先序遍历序列,字符串长度大于0且不超过100。
输出
见样例。
样例输入 Copy
| + 13 # # * 5 # # 9 # #
| * + 13 # # 5 # # 9 # #
样例输出 Copy
(13+(5*9))=58
((13+5)*9)=162
#include<bits/stdc++.h>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
typedef struct Node //二叉树结构定义
{
string data;
struct Node *lchild;
struct Node *rchild;
} *Bitree,BiNode;
void CreatBiTree(Bitree &T)
// 利用先序遍历创建二叉树
{
string s;
cin >> s;
if(s[0]=='#')
{
T = NULL; //如果是空,则这次递归的根指向空
}
else
{
T= new BiNode;
T->data=s;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
void Print(Bitree &T){
if(T){
if(T->data[0]=='+'||T->data[0]=='-'||T->data[0]=='*'||T->data[0]=='/'){
cout<<"(";
Print(T->lchild);
cout<<T->data;
Print(T->rchild);
cout<<")";
}
else cout<<T->data;
}
}
int compute(Bitree T){
if(T!=NULL){
if(T->data[0]=='+'||T->data[0]=='-'||T->data[0]=='*'||T->data[0]=='/')
{
switch(T->data[0])
{
case'+':return(compute(T->lchild)+compute(T->rchild));break;
case'-':return(compute(T->lchild)-compute(T->rchild));break;
case'*':return(compute(T->lchild)*compute(T->rchild));break;
case'/':return(compute(T->lchild)/compute(T->rchild));break;
}
}
else{
string a;
a=T->data;
int i,sum=0;
for(i=0;a[i]!='\0';i++)
sum=sum*10+a[i]-'0';//数字字符串转化为数字
return sum;
}//此处转化与计算后缀表达式不同,这里是一组一组输入,我们一组一组转化就好
}
}
int main(){
string s;
while (cin >> s)
{
Bitree T=new BiNode;
T->data=s;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
Print(T);
cout<<"="<<compute(T);
printf("\n");
}
}