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