题目:编写一个程序,先用二叉树来表示代数表达式,树的每一个结点包括一个运算符或者运算数,代数表达式中只包含加减乘除和一位整数且没有错误,并按先加减后乘除的原则构造二叉树,然后由对应的二叉树计算该表达式的值。 #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)); } }