二叉树计算中缀表达式
来源:互联网 发布:如何实现网页游戏编程 编辑:程序博客网 时间:2024/04/27 22:45
二叉树计算中缀表达式,暂时不支持括号,直接以字符串形式输入。
#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <malloc.h>typedef struct tagbintree{ char op; char level; /* 记录括号 */ double fvalue; struct tagbintree *lchild; struct tagbintree *rchild;}bintree;char getlevel(char op);int isop(char c);double caltree(const bintree *node);void distree(const bintree *node);void destorytree(bintree **node);void appendnode(bintree **node, char op, double value);bintree *createtree(const char *szexpress);int main(void){ bintree *root; root = createtree("12*15"); distree(root); printf("\n=%lf\n\n", caltree(root)); destorytree(&root); root = createtree("-12+390.564*56*78-90/18.56*129.35+86.073+1345.302+10.9301*99.01"); distree(root); printf("\n=%lf\n", caltree(root)); destorytree(&root); getch();}void distree(const bintree *node){ if (node == NULL) return; distree(node->lchild); distree(node->rchild); if (node->op != 0) printf("%c ", node->op); else printf("%f ", node->fvalue);}void destorytree(bintree **node){ if (*node == NULL) return; if ((*node)->lchild != NULL) destorytree(&(*node)->lchild); if ((*node)->rchild != NULL) destorytree(&(*node)->rchild); free(*node); *node = NULL;}void appendnode(bintree **node, char op, double value){ bintree *node1; bintree *node2; node1 = (bintree *)malloc(sizeof(bintree)); node1->op = op; node1->level = getlevel(op); node1->fvalue = 0; node2 = (bintree *)malloc(sizeof(bintree)); node2->op = 0; node2->level = getlevel(node2->op); node2->fvalue = value; node2->lchild = NULL; node2->rchild = NULL; node1->rchild = node2; if ((*node)->level != 0 && node1->level > (*node)->level) { bintree *childnode = *node; node1->lchild = (*node)->rchild; (*node)->rchild = node1; } else { node1->lchild = *node; *node = node1; }}char getlevel(char op){ if (op == 0) return 0; if (op == '*' || op == '/') return 2; if (op == '+' || op == '-') return 1;}int isop(char c){ if (c == '+' || c == '-' || c == '*' || c == '/') return 1; return 0;}double caltree(const bintree *node){ if (node->op == 0) return node->fvalue; if (node->op == '*') return caltree(node->lchild) * caltree(node->rchild); if (node->op == '/') return caltree(node->lchild) / caltree(node->rchild); if (node->op == '+') return caltree(node->lchild) + caltree(node->rchild); if (node->op == '-') return caltree(node->lchild) - caltree(node->rchild);}bintree *createtree(const char *szexpress){ const char *ptr = szexpress; char op; static char numstr[1024] = {"0"}; char *ptrnum = numstr; bintree *root; if (szexpress == NULL) return NULL; root = (bintree *)malloc(sizeof(bintree)); if (*ptr == '+' || *ptr == '-') { root->op = 0; root->level = getlevel(root->op); root->fvalue = 0; root->lchild = NULL; root->rchild = NULL; } else { while(*ptr) { if (isop(*ptr)) break; *ptrnum++ = *ptr; ptr++; } *ptrnum = '\0'; root->op = 0; root->level = getlevel(root->op); root->fvalue = atof(numstr); root->lchild = NULL; root->rchild = NULL; } if (*ptr != '\0') { op = *ptr; ptr++; ptrnum = numstr; while(*ptr) { if (isop(*ptr)) { *ptrnum = '\0'; appendnode(&root, op, atof(numstr)); ptrnum = numstr; op = *ptr; } else *ptrnum++ = *ptr; ptr++; } *ptrnum = '\0'; appendnode(&root, op, atof(numstr)); } return root;}
- 二叉树计算中缀表达式
- 二叉树计算中缀表达式
- 二叉树计算中缀表达式(二)
- 二叉树计算中缀表达式(三)
- 二叉树计算包含函数的中缀表达式
- 中缀表达式转为二叉树
- 中缀表达式转为二叉树
- 中缀表达式建立表达式二叉树
- 用二叉树后序遍历计算中缀表达式的值
- 用二叉树后序遍历计算中缀表达式的值
- 用二叉树写中缀表达式
- 前缀、中缀、后缀表达式和二叉树
- 中缀表达式树及其结果计算
- 中缀表达式计算
- C#计算中缀表达式
- 中缀表达式计算
- 中缀计算四则运算表达式
- 中缀表达式 转换成 前缀表达式(二叉树实现)
- 文档类,视图类,框架类,应用程序类句柄获取
- MFC界面类图
- Net gridview字段过长省略号显示
- Redo Threads
- Ubuntu 11.04安装gcc 4.5.2以下版本[比如gcc 4.1.1]
- 二叉树计算中缀表达式
- 自定义ImageView放大镜控件
- ASP.NET上传文件的三种基本方法
- Oracle 创建用户,分配空间,用户授权
- vs2010 无法调试 无法进入断点 断点无效
- C语言中结构体大小
- 两种方式实现Ubuntu下命令行拨号 之 wvdial
- GWT中的特殊变量
- windowSoftInputMode属性设置值