#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->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));    
  }

}