第十一周项目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
- 第十一周--项目2用二叉树求解代数表达式
- 第十一周项目2 - 用二叉树求解代数表达式
- 第十一周项目2-用二叉树求解代数表达式
- 第十一周项目2用二叉树求解代数表达式
- 第十一周项目2 - 用二叉树求解代数表达式
- 第十一周项目2-用二叉树求解代数表达式
- 第十一周项目2用二叉树求解代数表达式
- (第十一周项目2)用二叉树求解代数表达式
- 第十一周项目2 用二叉树求解代数表达式
- 第十一周项目2-用二叉树求解代数表达式
- 第十一周项目2--用二叉树求解代数表达式
- 第十一周项目2---用二叉树求解代数表达式
- 第十一周项目2-用二叉树求解代数表达式
- 第十一周 项目2-用二叉树求解代数表达式
- 第十一周--项目2 - 用二叉树求解代数表达式
- 第十一周项目2 - 用二叉树求解代数表达式
- 第十一周项目2-用二叉树求解代数表达式
- 第十一周 项目2 用二叉树求解代数表达式
- date_default_timezone_set('PRC')
- axis 设置log4j日志的等级
- 范式总结
- centos6.5 修改ssh默认端口号 禁用root登录
- Android 定位(三 基站)
- 第十一周项目2 用二叉树求解代数表达式
- 第十四周-线性表的折半查找
- java输入学生信息,按总分成绩由高到低排列,输出到文件中
- 第九周项目三:系数矩阵三元组表示的实现及应用
- IOS自动布局之Autoresizing
- Xcode 菜单选项的详细探索
- 事件驱动异步模式(BackgroundWorker)ProgressBar设置进度条
- Andoid开发问题及解决小结note
- hdoj 小明系列故事——未知剩余系 4542 (反素数&剪枝) 好题