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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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.结束

}

}

相关文档
最新文档