当前位置:文档之家› 波兰算法求二叉树表达式的值

波兰算法求二叉树表达式的值

逆波兰表达式
问题描述
逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。

逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。

本题求解逆波兰表达式的值,其中运算符包括+ - * / 四个。

输入数据
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数
输出要求
输出为一行,表达式的值。

输入样例
* + 11.0 12.0 + 24.0 35.0
输出样例
1357.000000
#include <stdio.h>
#include <stdlib.h>
#include "string.h"
struct node
{
char data[20];
node *lChild,*rChild;
};
int k=0;
doubleCalculateEepress(node *root)
{
k++;
if(root->data[0]>='0'&&root->data[0]<='9') return atof(root->data);
else
{
switch(root->data[0])
{
case '+': return CalculateEepress(root->lChild)+CalculateEepress(root->rChild);
case '-': return CalculateEepress(root->lChild)-CalculateEepress(root->rChild);
case '*': return CalculateEepress(root->lChild)*CalculateEepress(root->rChild);
case '/': return CalculateEepress(root->lChild)/CalculateEepress(root->rChild);
}
}
}
voidconstructExpress(node *&root)
{
char sub[20];
scanf("%s",sub);
if(sub[0]>='0'&&sub[0]<='9') //此即为终止条件
{
root=(node *)malloc(sizeof(node));
strcpy(root->data,sub);
}
else
{
root=(node *)malloc(sizeof(node));
strcpy(root->data,sub);
constructExpress(root->lChild);
constructExpress(root->rChild);
}
}
doubleCalculateEepressByString()
{
char sub[20];
scanf("%s",sub);
if(sub[0]>='0'&&sub[0]<='9')
{
returnatof(sub);
}
else
{
switch(sub[0])
{
case '+': return CalculateEepressByString()+CalculateEepressByString();
case '-': return CalculateEepressByString()-CalculateEepressByString();
case '*': return CalculateEepressByString()*CalculateEepressByString();
case '/': return CalculateEepressByString()/CalculateEepressByString();
}
}
}
voidConvertEepressByString()
{
char sub[20];
scanf("%s",sub);
if(sub[0]>='0'&&sub[0]<='9')
{
printf("%s",sub);
}
else
{
switch(sub[0])
{
case '+': {ConvertEepressByString(); printf("%c",'+'); ConvertEepressByString();break;}
case '-': {ConvertEepressByString(); printf("%c",'-'); ConvertEepressByString();break;}
case '*': {ConvertEepressByString(); printf("%c",'*'); ConvertEepressByString();break;}
case '/': {ConvertEepressByString(); printf("%c",'/'); ConvertEepressByString();break;}
}
}
}
// case后的break没有将如何?
void main( )
{
node *exp;
printf("请输入逆波兰式: \n");
ConvertEepressByString();
printf("\n");
// constructExpress(exp);
// printf("逆波兰式的结果为%f.\n",CalculateEepressByString());
printf("Call CalculateEepress(node *root) %d次.\n",k);
}。

相关主题