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");}
阅读全文
0 0
- C:算数表达式转二叉树
- 第十一周项目2-用二叉树求解算数表达式
- 数据结构:简单算数表达式二叉树的构建和求值
- C/C++ 算数表达式计算
- C语言算数运算符和算数表达式
- 算数表达式求值(C语言)
- 表达式转二叉树
- C语言 算数表达式求值(顺序栈应用实例)
- 【C语言】【11】算术运算符与算数表达式
- C/C++ 算法 中缀转后缀表达式实现2---实现加减乘除四则算数(整型,包括括号)
- C/C++ 算法 中缀转后缀表达式实现3---实现加减乘除四则算数(包括浮点数运算,包括括号)
- 算数表达式求值
- 逆波兰算数表达式
- 算数表达式求值
- 数据结构实验:算数表达式
- 算数表达式求值
- shell算数表达式运算
- 算数表达式求值
- PAT乙级(Basic Level)真题德才论 (25)java解法
- GIT 学习笔记
- C
- 记录如何解决通过vpn链接公司内网,但是上不了外网的问题
- 大数据之R语言是什么?
- C:算数表达式转二叉树
- 加载内核模块-Unknown symbol错误分析
- django 性能测试 functools
- IT之家学院:让你的Win10桌面比macOS还简洁漂亮高大上
- Docker 在 CentOS 下的安装及使用
- 基于SnapDragonBoard410c内置文佳到System
- Eureka 源码解析 —— Eureka-Client 初始化(二)之 EurekaClientConfig
- react---自定义audio组件
- 电脑是否被监控?几个步骤教你判断