您的位置:首页 > 其它

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

2017-12-13 11:03 232 查看
/* 

*Copyright(c)2017,烟台大学计算机学院 

*All right reserved. 

*文件名:sk.cpp btree.h btree.cpp 

*作者:盛凯 

*完成日期:2017年12月13日 

*版本号:v1.0 



*问题描述:用二叉树来表示代数表达式

*输入描述:无 

*程序输出:见运行结果

sk.cpp:

#include <stdio.h>

#include <string.h>

#include <malloc.h>

#include <cstdlib>

#include "btree.h"

//用s[i]到s[j]之间的字符串,构造二叉树的表示形式

BTNode *CRTree(char s[],int i,int j)

{

    BTNode *p;

    int k,plus=0,posi;

    if (i==j)    //i和j相同,意味着只有一个字符,构造的是一个叶子节点

    {

        p=(BTNode *)malloc(sizeof(BTNode));   //分配存储空间

        p->data=s[i];                         //值为s[i]

        p->lchild=NULL;

        p->rchild=NULL;

        return p;

    }

    //以下为i!=j的情况

    for (k=i; k<=j; k++)

        if (s[k]=='+' || s[k]=='-')

        {

            plus++;

            posi=k;              //最后一个+或-的位置

        }

    if (plus==0)                 //没有+或-的情况(因为若有+、-,前面必会执行plus++)

        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];                //节点值是s[posi]

        p->lchild=CRTree(s,i,posi-1);   //左子树由s[i]至s[posi-1]构成

        p->rchild=CRTree(s,posi+1,j);   //右子树由s[poso+1]到s[j]构成

        return p;

    }

    else       //若没有任何运算符,返回NULL

        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';    //叶子节点直接返回节点值,结点中保存的数字用的是字符形式,所以要-'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;

}

程序运行结果如图所示:



反思总结:
运用了二叉树的知识来求解代数表达式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: