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

上传人:b****3 文档编号:15723730 上传时间:2022-11-15 格式:DOCX 页数:34 大小:199.34KB
下载 相关 举报
题目设计一个程序实现基于二叉树表示的算术表达式的操作Word文件下载.docx_第1页
第1页 / 共34页
题目设计一个程序实现基于二叉树表示的算术表达式的操作Word文件下载.docx_第2页
第2页 / 共34页
题目设计一个程序实现基于二叉树表示的算术表达式的操作Word文件下载.docx_第3页
第3页 / 共34页
题目设计一个程序实现基于二叉树表示的算术表达式的操作Word文件下载.docx_第4页
第4页 / 共34页
题目设计一个程序实现基于二叉树表示的算术表达式的操作Word文件下载.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

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

《题目设计一个程序实现基于二叉树表示的算术表达式的操作Word文件下载.docx》由会员分享,可在线阅读,更多相关《题目设计一个程序实现基于二叉树表示的算术表达式的操作Word文件下载.docx(34页珍藏版)》请在冰豆网上搜索。

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

+*5^x2*8x;

+++*3^x3*2^x2x6,还有几十组数据测试。

每当输入一个表达式后,程序提示用户赋值,再对表达式求值。

为了方便用户,我在程序中用数组保存着一些测试数据,以供测试用。

二、概要设计

1.以字符串保存输入的字符序列。

2.提示用户赋值的同时将数据取出建立二叉树。

3.用后根遍历的次序用递归函数对表达式求值,求值时进行相应的转化,将运算数的字符形式转换成整数形式。

4.用中缀表达式输出表达式时,适当添加括号,以正确反映运算的优先次序。

5.抽象数据类型的定义:

1)、存放表达式的结构类型,是以二叉树为基本原型。

typedefenum{OPER,VAR,ORD}ElemTag;

//运算符,变量,常量

typedefstructExpNode

{

ElemTagtag;

//标记

union{

charexpr[4];

//存放运算符名

struct{

charvar;

//存放变量名

intval;

//存放变量的值,初始值为0

}vary;

//存放变量

intordina;

//存放常量值

};

structExpNode*lchild,*rchild;

/*左右孩子指针*/

}*ExpTree;

/*二叉树的二叉链表存储表示*/

基本操作:

intRandom(intnMin,intnMax);

//返回nMin到nMax之间的随机数

voidFindVary(char*c,char*e);

//找出表达式中的变量

StatusArrayCreateExp(ExpTree&

E,char*ch,int&

i);

//从ch数组中读取字符串,构造表达式

voidCreateExp(ExpTree&

i);

//StatusInputCreateExp(ExpTree&

E);

//从键盘先序输入来构造表达式树T

StatusVisit(ExpTreee);

//输出e的内容

voidInorderExp(ExpTreeE,Status(*Visit)(ExpTreee));

//输出中序表达式用带括号的中缀表示式输出

StatusAssign(ExpTreeE,charv,floatc);

//对表达式内的所有v,赋值c

floatValue(ExpTreeE);

//计算表达式的值

ExpTreeCompound(charp,ExpTreee1,ExpTreee2);

//5.构造一个新的复合表达式(E1)P(E2)

StatusDiff(ExpTree&

E,charV);

//求表达式E对变量V的导数

voidMergeConst(ExpTreeE);

//合并表达式种所有常数运算

StatusPreOrderTraverse(ExpTreeE,Status(*Visit)(ExpTreee));

//波兰式输出

StatusPostOrderTraverse(ExpTreeE,Status(*Visit)(ExpTreee));

//逆波兰式输出

2)、队列

typedefcharQElemType;

typedefstructQNode

QElemTypedata;

structQNode*next;

}QNode,*QuePtr;

typedefstruct

QuePtrfront;

QuePtrrear;

}Queue;

StatusInitQueue(Queue&

Q);

//构造一个空队列

StatusDestroyQueue(Queue&

//销毁队列

StatusQueueEmpty(QueueQ);

//判空

StatusEnQueue(Queue&

Q,QElemTypee);

//插入元素e为Q的新的队尾元素

StatusDeQueue(Queue&

Q,QElemType&

e);

//删除队头元素,用e返回其值,并返回OK,否则返回ERROR;

3)、栈

SElemType*base;

SElemType*top;

intstacksize;

}SqStack;

StatusInitStack(SqStack&

S);

StatusStackEmpty(SqStackS);

StatusPush(SqStack&

S,SElemTypee);

StatusPop(SqStack&

S,SElemType&

SElemTypeTop(SqStackS);

 

6、主程序:

voidmain()

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、存放表达式的结构类型,是以二叉树为基本原型。

我原来是直接用二叉树的存储结构的,后来发现受到这个结构类型的很大限制,受到广义表存储结构的启发,就自己设计了这样一个存储类型。

下面分析这个存储结构:

(1)、用ElemTagtag;

来标记是运算符,变量,常量。

用枚举类型定义typedefenum{OPER,VAR,ORD}ElemTag,可以区分是运算符,变量,常量。

(2)、用字符串charexpr[4];

来存放运算符名,我先预定存放三个字符的运算符名(最后一个char用来存放’\0’),这样运算符不仅可以是'

+'

,'

-'

*'

,'

/'

^'

,还可以是’sin’,’cos’,’tan’。

如果觉得三个字符不够,可以扩展。

(3)、struct{charvar;

//存放变量名floatval;

//存放变量的值,初始为0}vary;

//存放变量。

这样在变量赋值后,还可以保存着变量名。

可以用作如公式一样,重复赋值使用。

(4)、使用intordina;

来存放常量值。

这样赋值时,就扩大了赋值范围,可以是一个整形的范围,大大扩大了本程序的使用范围。

但需要在赋值时使用,在输入时,还是得用0-9,这也是本程序的缺陷,有待改进。

2、队列。

StatusDestroyQueue(

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 历史学

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

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