第十一周项目2 用二叉树求解代数表达式

来源:互联网 发布:嘉视丽机顶盒安装软件 编辑:程序博客网 时间:2024/04/29 02:43
<pre name="code" class="cpp">#include <stdio.h>#include <malloc.h>#include<string.h>#include <stdlib.h>  #define MaxSize 100typedef char ElemType;typedef struct node{    ElemType data;                  struct node *lchild;            struct node *rchild;        } BTNode;void CreateBTNode(BTNode *&b,char *str);        BTNode *FindNode(BTNode *b,ElemType x);     BTNode *LchildNode(BTNode *p);  BTNode *RchildNode(BTNode *p);  int BTNodeDepth(BTNode *b); void DispBTNode(BTNode *b); void DestroyBTNode(BTNode *&b);  void CreateBTNode(BTNode *&b,char *str)     {    BTNode *St[MaxSize],*p=NULL;    int top=-1,k,j=0;    char ch;    b=NULL;                 ch=str[j];    while (ch!='\0')        {        switch(ch)        {        case '(':            top++;            St[top]=p;            k=1;            break;             case ')':            top--;            break;        case ',':            k=2;            break;                                  default:            p=(BTNode *)malloc(sizeof(BTNode));            p->data=ch;            p->lchild=p->rchild=NULL;            if (b==NULL)                                    b=p;            else                                        {                switch(k)                {                case 1:                    St[top]->lchild=p;                    break;                case 2:                    St[top]->rchild=p;                    break;                }            }        }        j++;        ch=str[j];    }}BTNode *FindNode(BTNode *b,ElemType x)  {    BTNode *p;    if (b==NULL)        return NULL;    else if (b->data==x)        return b;    else    {        p=FindNode(b->lchild,x);        if (p!=NULL)            return p;        else            return FindNode(b->rchild,x);    }}BTNode *LchildNode(BTNode *p)   {    return p->lchild;}BTNode *RchildNode(BTNode *p)   {    return p->rchild;}int BTNodeDepth(BTNode *b)  {    int lchilddep,rchilddep;    if (b==NULL)        return(0);                              else    {        lchilddep=BTNodeDepth(b->lchild);           rchilddep=BTNodeDepth(b->rchild);          return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);    }}void DispBTNode(BTNode *b)  {    if (b!=NULL)    {        printf("%c",b->data);        if (b->lchild!=NULL || b->rchild!=NULL)        {            printf("(");            DispBTNode(b->lchild);            if (b->rchild!=NULL) printf(",");            DispBTNode(b->rchild);            printf(")");        }    }}void DestroyBTNode(BTNode *&b)   {    if (b!=NULL)    {        DestroyBTNode(b->lchild);        DestroyBTNode(b->rchild);        free(b);    }}BTNode *CRTree(char s[],int i,int j){    BTNode *p;    int k,plus=0,posi;    if (i==j)       {        p=(BTNode *)malloc(sizeof(BTNode));           p->data=s[i];                                p->lchild=NULL;        p->rchild=NULL;        return p;    }        for (k=i; k<=j; k++)        if (s[k]=='+' || s[k]=='-')        {            plus++;            posi=k;                      }    if (plus==0)                         for (k=i; k<=j; k++)            if (s[k]=='*' || s[k]=='/')            {                plus++;                posi=k;            }    if (plus!=0)    {        p=(BTNode *)malloc(sizeof(BTNode));        p->data=s[posi];                        p->lchild=CRTree(s,i,posi-1);           p->rchild=CRTree(s,posi+1,j);          return p;    }    else               return NULL;}double Comp(BTNode *b){    double v1,v2;    if (b==NULL)        return 0;    if (b->lchild==NULL && b->rchild==NULL)          return b->data-'0';        v1=Comp(b->lchild);     v2=Comp(b->rchild);     switch(b->data)         {    case '+':        return v1+v2;    case '-':        return v1-v2;    case '*':        return v1*v2;    case '/':        if (v2!=0)            return v1/v2;        else            abort();    }}int main(){    BTNode *b;    char s[MaxSize]="1+2*3-4/5";    printf("代数表达式%s\n",s);    b=CRTree(s,0,strlen(s)-1);    printf("对应二叉树:");    DispBTNode(b);    printf("\n表达式的值:%g\n",Comp(b));    DestroyBTNode(b);    return 0;}


<img src="http://img.blog.csdn.net/20151204085443731?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
0 0
原创粉丝点击