- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
题目:设计一个程序实现基于二叉树表示的算术表达式的操作。
一、 需求分析
1、以二叉树为基本模型,构建了表达式二叉树。算术表达式的合法输入数据包括变量(,a~z)、常量(0-9)和二元运算符(+,-,*,/,^(乘幂)),一元运算符(sin, cos,tan)。演示程序以人机对话的方式执行,即在计算机上显示提示信息后,由用户在键盘上输入对应的数据或命令,程序将执行相应的操作并显示下一步信息。表达式的输出主要是用带括号的中缀表示式输出调用函数InorderExp( ExpTree E, Status ( * Visit )( ExpTree e ) );
2、 程序的目的实现算术表达式在计算机里的树形存储,实现基本的运算(+,-,*,/,^(乘幂))sin,cos,tan),求偏导,常数合并。
3、 测试数据( 附后 )。
提供两种方式的测试:一种是自动测试,即程序调用test文件夹data.txt文件里的测试数据,另一种方式是手动测试,即按程序提示一步一步输入测试。
除了满足要求的0; a; -91; +a*bc; +*5^x2*8x; +++*3^x3*2^x2x6,还有几十组数据测试。每当输入一个表达式后,程序提示用户赋值,再对表达式求值。为了方便用户,我在程序中用数组保存着一些测试数据,以供测试用。
二、概要设计
1.以字符串保存输入的字符序列。2.提示用户赋值的同时将数据取出建立二叉树。3.用后根遍历的次序用递归函数对表达式求值,求值时进行相应的转化,将运算数的字符形式转换成整数形式。4.用中缀表达式输出表达式时,适当添加括号,以正确反映运算的优先次序。5.抽象数据类型的定义:
1)、存放表达式的结构类型,是以二叉树为基本原型。
typedef enum{ OPER, VAR, ORD }ElemTag;//运算符,变量,常量
typedef struct ExpNode
{
ElemTag tag; //标记
union{
char expr[4]; //存放运算符名
struct{
char var; //存放变量名
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数组中读取字符串,构造表达式
void CreateExp( ExpTree E, char *ch, int i ) ;
//Status InputCreateExp( ExpTree E );
//从键盘先序输入来构造表达式树T
Status Visit( ExpTree e );
//输出e的内容
void InorderExp( ExpTree E, Status ( * Visit )( ExpTree e ) );
//输出中序表达式用带括号的中缀表示式输出
Status Assign( ExpTree E, char v, float c ) ;
//对表达式内的所有v,赋值c
float Value( ExpTree E );
//计算表达式的值
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 )( ExpTree e ) );
//逆波兰式输出
2)、队列
typedef char QElemType;
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNod
原创力文档


文档评论(0)