您的位置:首页 > 其它

二叉树表达规定形式的代数表达式并计算表达式结果(有缺陷版本)

2010-05-15 13:54 323 查看
题目:编写一个程序,先用二叉树来表示代数表达式,树的每一个结点包括一个运算符或者运算数,代数表达式中只包含加减乘除和一位整数且没有错误,并按先加减后乘除的原则构造二叉树,然后由对应的二叉树计算该表达式的值。

#include<stdio.h>

//程序缺陷:4/5这样的浮点结果不能正确计算.待改进.
//仔细分析有代表性的实例,发现规律.

typedef struct node    // 结点类型定义
{
char data;
struct node *lchild;
struct node *rchild;
}BTNode;

BTNode *create(char *str,int n)    // 创建代数表达式对应的二叉树
{
BTNode *root = NULL;   //始终指向当前已经生成的二叉树的根
BTNode *p = NULL;       //始终指向当前待处理结点
char ch;
int j = 0;
ch = str[j];
while(ch!='/0' && j < n)
{
switch(ch)
{
case '0':   //数字的处理
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
p = new BTNode;
p->data = ch;
if(root == NULL)
root = p;
else if(root->rchild == NULL)
root->rchild = p;
else
root->rchild->rchild=p;
break;
case'+': //扫描到'+''-',作为当前根结点
case'-':
p = new BTNode;
p->data = ch;
p->rchild = NULL;
p->lchild = root;
root = p;
root->rchild = NULL;
break;
case'*':    //'*'和'/'的处理
case'/':
if(root->data >= '0' && root->data <= '9' || root->data == '*' || root->data == '/')
{
p=new BTNode;
p->data = ch;
p->rchild = NULL;
p->lchild = root;
root = p;
}
else
{
p = new BTNode;
p->data = ch;
p->lchild = root->rchild;
root->rchild = p;
p->rchild = NULL;
}
break;
}
j++;
ch=str[j];
}
return root;
}
int result(BTNode *b) //计算表达式
{
int n1,n2;
if(b->data>='0'&&b->data<='9')
return (b->data-'0');
n1=result(b->lchild);//计算左子表达式
n2=result(b->rchild);//计算右子表达式
switch(b->data)
{
case'+':
b->data=n1+n2;break;
case'-':
b->data=n1-n2;break;
case'*':
b->data=n1*n2;break;
case'/':
b->data=n1/n2;break;
}
return b->data;
}
void main()
{
BTNode *b=NULL,*q=NULL;
char str[100];
printf("请输入符合要求的代数表达式:");
scanf("%s",str);
int n=0,i=0;
while(str[i++] != '/0')
n++;
b = create(str,n);
printf("该表达式的值为:%d/n",result(b));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: