题目描述
读入表达式树的先序遍历字符串,求其值。运算符只可能是加减乘除,保证输入的每个子表达式树的结果都是整数值且可以用C语言的int类型表达。
输入
输入由多组测试数据组成。
每组数据包含一行字符串,即表达式树的先序遍历序列,字符串长度大于0且不超过100。
输出
见样例。
样例输入
+ 13 # # * 5 # # 9 # #
* + 13 # # 5 # # 9 # #
样例输出
(13+(5*9))=58
((13+5)*9)=162
思路:照着题目模拟,值得关注的是对输入字符时候的处理,刚开始我是输入了一行然后再提取,容易答案错误还有运行错误,参考同学代码发现他的处理实在巧妙,可以当做字符性质的二叉树的模板
#include <cstdio>
#include <cstring>
using namespace std;
#define OK 1
#define ERROR 0
typedef struct
{
int num; //存储整形数字
char ch; //存储运算符号
} ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
void InitBiTree(BiTree &T)
{
char s[10];
cin>>s; //巧妙的处理同时避免了多个空格的尴尬
if (s[0]=='#') T=NULL;
else
{
T=new BiTNode;
if (s[0]=='+'||s[0]=='-'||s[0]=='*'||s[0]=='/')
T->data.ch=s[0];
else
{
int n=0;
for (int i=0; i<strlen(s); i++)
n=n*10+(s[i]-'0');
T->data.num=n; //字符的数字转化为整形
}
InitBiTree(T->lchild);
InitBiTree(T->rchild);
}
}
//遍历运算并输出表达式
int Travel(BiTree T)
{
int re;
if (T->lchild==NULL&&T->rchild==NULL){
printf("%d",T->data.num);
re=T->data.num;
}
else
{
printf("(");
int num1=Travel(T->lchild);
printf("%c",T->data.ch);
int num2=Travel(T->rchild);
printf(")");
switch (T->data.ch){
case '+':re=num1+num2; break;
case '-':re=num1-num2; break;
case '*':re=num1*num2; break;
case '/':re=num1/num2; break;
}
}
return re;
}
int main()
{
BiTree T;
char c[10];
while (cin>>c)
{
if (c[0]=='#') //根节点是否为空
T=NULL;
else
{
//初始化二叉树
T=new BiTNode;
if (c[0]=='+'||c[0]=='-'||c[0]=='*'||c[0]=='/')
T->data.ch=c[0];
else
{
int n=0;
for (int i=0; i<strlen(c); i++) n=n*10+(c[i]-'0');
T->data.num=n;
}
InitBiTree(T->lchild);
InitBiTree(T->rchild);
}
//遍历得出结果
int re=Travel(T);
printf("=%d\n",re);
}
return 0;
}