题目设计一个程序实现基于二叉树表示的算术表达式的操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:设计一个程序实现基于二叉树表示的算术表达式的操作。
一、需求分析
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;
}QNode, *QuePtr;
typedef struct
{
QuePtr front;
QuePtr rear;
}Queue;
基本操作:
Status InitQueue( Queue &Q );
//构造一个空队列
Status DestroyQueue( Queue &Q );
//销毁队列
Status QueueEmpty( Queue Q );
//判空
Status EnQueue( Queue &Q, QElemType e );
//插入元素e为Q的新的队尾元素
Status DeQueue( Queue &Q, QElemType &e );
//删除队头元素,用e返回其值,并返回OK,否则返回ERROR;
3)、栈
typedef struct
{
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 &e );
SElemType Top( SqStack S );
6、主程序:
void main()
{
while(1)
{ 接受命令
处理命令;
Switch()
{
case: 1.以数组形式输入前缀表示式函数构造表达式.
case: 2.以字符序列输入前缀表示式函数构造表达式.
case: 3.实现对变量V的赋值(V=c).
case: 4.对算术表达式E求值.\n");
case: 5.构造一个新的复合表示式(E1)P(E2).
case: 6.求偏导函数Diff(E,V)
case: 7.对三角函数的测试.
case: 8.常数合并.
case: 0.结束
}
}