您的位置:首页 > 其它

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

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

#include <stdio.h>

//仔细分析有代表性的实例,发现规律.

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

BTNode *create(char *str,int n)    // 创建代数表达式对应的二叉树
{
BTNode *root = NULL;   //始终指向当前已经生成的二叉树的根
BTNode *p = NULL;       //始终指向当前待处理结点
float ch;
int j = 0;
ch = str[j];
while(ch != '/0' && j < n)
{
if(ch == '0' || ch == '1' ||ch == '2' ||ch == '3'||ch == '4' ||
ch == '5' || ch == '6' || ch == '7' || ch == '8'|| ch == '9')
{

p = new BTNode;
p->data = ch;
p->sign = false;
if(root == NULL)
root = p;
else if(root->rchild == NULL)
root->rchild = p;
else
root->rchild->rchild=p;
}

else if(ch == '+' || ch == '-')
{
p = new BTNode;
p->data = ch;
p->sign = true;
p->rchild = NULL;
p->lchild = root;
root = p;
root->rchild = NULL;
}
else if(ch == '*' || ch == '/')
{
if(root->data >= '0' && root->data <= '9' || root->data == '*' || root->data == '/')
{
p=new BTNode;
p->data = ch;
p->sign = true;
p->rchild = NULL;
p->lchild = root;
root = p;
}
else
{
p = new BTNode;
p->data = ch;
p->sign = true;
p->lchild = root->rchild;
root->rchild = p;
p->rchild = NULL;
}
}
j++;
ch=str[j];
}
return root;
}
float result(BTNode *b) //计算表达式
{
float n1,n2;
if(b->sign == false && b->data >= '0' && b->data <= '9')
return (b->data - '0');

n1 = result(b->lchild);//计算左子表达式
n2 = result(b->rchild);//计算右子表达式

if (b->sign == true && b->data == '+')
b->data = n1 + n2;
else if (b->sign == true && b->data == '-')
b->data = n1 - n2;
else if (b->sign == true && b->data == '*')
b->data = n1 * n2;
else if (b->sign == true && b->data == '/')
b->data = n1 / n2;

return b->data;
}
void main()
{
while(true)
{
BTNode static *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("该表达式的值为:%f/n", result(b));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: