C:算数表达式转二叉树

来源:互联网 发布:淘宝买近视眼镜靠谱吗 编辑:程序博客网 时间:2024/05/18 07:45

上周四,离散数学了二叉树的相关知识,我当时就觉得我的“算数表达式求解”程序有救了。其实在这之前,我写了好几个多重嵌套循环,还一大堆BUG,当时就把代码删了,删之前浏览了一遍,根本看不懂自己在写什么,只能想其他方法,直到上周四(果然离散数学没白学)
算数表达式转二叉树有两个关键点:
1.如何找到一个算数表达中最后与运算的部分。
2.找到之后如何修改表达式用于下一次执行步骤(1)。
当时想的时候一头雾水,最终不得已上网查资料(http://blog.csdn.net/qq120848369/article/details/5673969),找到了一个方法——定义一个标志变量=0,利用循环判断表达式中的每个字符,遇到‘(’就自增,遇到‘)’就自减,遇到非括号就判断标志变量是否为0,为0则代表在括号外面,则判断括号外最后一个运算符‘+-*/’,之后以运算符为分界点分割表达式为两个表达式,重复判断。
很明显,这个应该用递归算法实现,有了这个思路后,写起代码就简单多了。**

#include <stdio.h>#include <Windows.h>#include <malloc.h>typedef struct BTree{    char data;    struct BTree *LT;    struct BTree *RT;}btree;/*    tree *tree(char *c,int first,int last)函数说明        c:表示传进来表达式        first:表示传递进来的表达式的第一项的位置        last:表示传递进来的表达式的最后一项的下一项的位置*/btree *tree(char *c,int first,int last){    //  如果为数字,则终止递归    if (last - first == 1)    {        btree *bn;        bn = (btree*)malloc(sizeof(btree));        bn->data = c[first];        bn->LT = bn->RT = NULL;        return bn;    }    int flag = 0, AddPossition = 0, MulPossition = 0, data_ch;    /*        flag:标识变量,用来确定是否在括号内        AddPossiton:记录最后一个加号,减号的位置        MulPossition:记录最后一个乘号,除号的位置    */    for (int i = first; i < last; i++)    {        if (c[i] == '(')            flag++;        if (c[i] == ')')            flag--;        if (flag == 0)//如果在括号外        {            if (c[i] == '+' || c[i] == '-')                AddPossition = i;            if (c[i] == '*' || c[i] == '/')                MulPossition = i;        }    }    //  如果最外面的括号外面没有运算符,例如((12+1)*(35/5)),则删除括号,反之则建树    if (AddPossition == 0 && MulPossition == 0)        tree(c, first + 1, last - 1);    else    {        if (AddPossition != 0)            data_ch = AddPossition;        else        {            if (MulPossition != 0)                data_ch = MulPossition;        }        btree *p;        p = (btree*)malloc(sizeof(btree));        p->data = c[data_ch];        p->LT = tree(c, first, data_ch);//重新定义递归参数,传递运算符左边的表达式建立左树        p->RT = tree(c, data_ch+1, last);//重新定义递归参数,传递运算符右边的表达式建立右树        return p;    }}int main(){    btree *h;    char a[9999];    printf("请输入数学表达式,以回车结束:\n");    gets_s(a);    int len = strlen(a);    h = (btree*)malloc(sizeof(btree));    h = tree(a, 0, len);    system("pause");}
原创粉丝点击