ImageVerifierCode 换一换
格式:DOCX , 页数:34 ,大小:231.37KB ,
资源ID:18812909      下载积分:2 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18812909.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(题目设计一个程序实现基于二叉树表示的算术表达式的操作文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

题目设计一个程序实现基于二叉树表示的算术表达式的操作文档格式.docx

1、 /存放变量名 int val; /存放变量的值,初始值为0 vary; /存放变量 int ordina; /存放常量值 ; struct ExpNode *lchild, *rchild; /* 左右孩子指针 */ *ExpTree; /* 二叉树的二叉链表存储表示 */基本操作:int Random( int nMin, int nMax );/返回nMin到nMax之间的随机数void FindVary( char * c, char * e );/找出表达式中的变量Status ArrayCreateExp( ExpTree &E, char *ch, int &i );/从ch数组

2、中读取字符串,构造表达式void CreateExp( ExpTree &i ) ;/Status InputCreateExp( ExpTree &E ); /从键盘先序输入来构造表达式树TStatus Visit( ExpTree e );/输出e的内容void InorderExp( ExpTree E, Status ( * Visit )( ExpTree e ) );/输出中序表达式用带括号的中缀表示式输出Status Assign( ExpTree E, char v, float c ) ;/对表达式内的所有v,赋值cfloat Value( ExpTree E );/计算表达

3、式的值ExpTree Compound( char p, ExpTree e1, ExpTree e2 );/5.构造一个新的复合表达式(E1)P(E2) Status Diff( ExpTree &E, char V );/求表达式E对变量V的导数void MergeConst( ExpTree E );/合并表达式种所有常数运算Status PreOrderTraverse( ExpTree E, Status ( * Visit )( ExpTree e ) );/波兰式输出Status PostOrderTraverse( ExpTree E, Status ( * Visit )(

4、ExpTree e ) );/逆波兰式输出2)、队列typedef char QElemType;typedef struct QNode QElemType data; struct QNode *next;QNode, *QuePtr;typedef struct QuePtr front; QuePtr rear;Queue;Status InitQueue( Queue &Q );/构造一个空队列Status DestroyQueue( Queue &/销毁队列Status QueueEmpty( Queue Q );/判空Status EnQueue( Queue &Q, QElem

5、Type e );/插入元素e为Q的新的队尾元素Status DeQueue( Queue &Q, QElemType &e );/删除队头元素,用e返回其值,并返回OK,否则返回ERROR;3)、栈 SElemType *base; SElemType *top; int stacksize;SqStack;Status InitStack( SqStack &S );Status StackEmpty( SqStack S );Status Push( SqStack &S, SElemType e );Status Pop( SqStack &S, SElemType &SElemTyp

6、e Top( SqStack S );6、 主程序:void main()while(1) 接受命令 处理命令;Switch() case: 1.以数组形式输入前缀表示式函数构造表达式. 2.以字符序列输入前缀表示式函数构造表达式. 3.实现对变量V的赋值(V=c). 4.对算术表达式E求值.n); 5.构造一个新的复合表示式(E1)P(E2). 6.求偏导函数Diff(E,V) 7.对三角函数的测试. 8.常数合并. 0.结束 三、详细设计1、存放表达式的结构类型,是以二叉树为基本原型。我原来是直接用二叉树的存储结构的,后来发现受到这个结构类型的很大限制,受到广义表存储结构的启发,就自己设计

7、了这样一个存储类型。下面分析这个存储结构:(1)、用ElemTag tag;来标记是运算符,变量,常量。用枚举类型定义typedef enum OPER, VAR, ORD ElemTag,可以区分是运算符,变量,常量。(2)、用字符串char expr4; 来存放运算符名,我先预定存放三个字符的运算符名(最后一个char用来存放0),这样运算符不仅可以是+ , -*,/,还可以是sin,cos,tan。如果觉得三个字符不够,可以扩展。(3)、struct char var; /存放变量名 float val; /存放变量的值,初始为0 vary;/存放变量。这样在变量赋值后,还可以保存着变量

8、名。可以用作如公式一样,重复赋值使用。(4)、使用int ordina;来存放常量值。这样赋值时,就扩大了赋值范围,可以是一个整形的范围,大大扩大了本程序的使用范围。但需要在赋值时使用,在输入时,还是得用09,这也是本程序的缺陷,有待改进。2、队列。3、栈4、主函数和其他主要函数1)、访问函数(输出函数)Status Visit( ExpTree e ) int m, n5; if( e-tag = OPER ) /运算符 printf(%s, e-expr ); else if( e-tag = VAR ) /变量 if( !e-vary.val ) /变量的值是0%cvary.var );

9、/输出变量名 else%0.4fvary.val );/输出变量的值 else /常量 if( e-ordina = 0 ) /正数%dordina );(%d) /负数,输出时加括号 return OK;2)、构造表达式i ) if( chi ) ( E = ( ExpTree )malloc( sizeof( ExpNode ) ) ) ) return ERROR; if( chi = s & chi+1 = i chi+2 = n |/sin chi = SIN |co |/cosCOta |/tanTA ) E-tag = OPER;expr0 = chi; E-expr1 = ch

10、+i;expr2 = ch+i;expr3 = 0; ArrayCreateExp( E-rchild, ch, +i );/只建右子树lchild = NULL; /左子树为空 return OK; else if( chi = 0 chi lchild ) bracket = precede( E, E-lchild );/比较双亲与左孩子运算符优先级 if( bracket 0 ) /左孩子优先级低 printf( InorderExp( E-lchild, Visit ); 0 ) ) Visit( E );rchild )rchild );/比较双亲与右孩子运算符优先级= 0 ) /

11、右孩子优先级低 rchild, Visit );= 0 ) 4)、计算表达式的值float Value( ExpTree E ) float lv,rv,value = 0;tag = VAR ) /是变量 return ( E-tag = ORD )lchild ) lv = Value( E- rv = Value( E- switch( E-expr0 ) case : value = lv + rv; break; value = lv - rv; value = lv * rv; if( rv ) value = lv / rv; else exit( 0 ); break; val

12、ue = power( lv, rv ); case value = sin( rv );/sin value = tan( rv );/tan if( E-expr2 = | E- )/cos value = cos( rv ); break; return ( value );5)、合并常数void MergeConst( ExpTree E )/合并表达式中所有常数运算 if( !lchild & !rchild ) return; /叶子 if( E-tag = OPER &rchild &lchild-tag = ORD &rchild- E- case ordina = E-ord

13、ina * E-ordina; break;ordina / E-ordina = power( E-ordina, E-ordina + E-ordina - E- free( E- else MergeConst( E-5、构造的表达式如图算术表达式前缀表示:*+ab-cd中缀带括号表示:(a+b)*(c-d)四、 调试分析1、调试过程中遇到了许多问题,下面举几个例子。(1)赋值出错处理在调试赋值函数时发生了“赋值失败的情况”修改前的函数:void FindVary( char *c, char * e ) int i = -1, j = 0; while( e+i ) if( ei ei ) i += 2; continue; else cj+ = ei; cj = 0;调试出现下面的情况出现了两次了对X的赋值,原因是我在编写void FindVary( char *c, ch

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1