资源简介
【问题的描述】
一个表达式和一棵二叉树之间,存在着自然的对应关系。写一个程序,实现基于二叉树表示的算术表达式Expression的操作。
【基本要求】
【一】【必做部分】
假设算术表达式Expression内可以含有变量(a-z),常量(0-9)和二元运算符(+,-,*,/,^(乘幂))。实现以下操作:
(1)ReadExpr(E)――以字符序列的形式输入语法正确的前缀表达式并构造表达式E。
(2)WriteExpr(E)――用带括号的中缀表达式输出表达式E。
(3)Assign(V,c)――实现对变量V的赋值(V=c),变量的初值为0。
(4)Value(E)――对算术表达式E求值。
(5)CompoundExpr(p,E1,E2)――构造一个新的复合表达式(E1)p(E2)。
【二】【选做部分】
(1)以表达式的原书写形式输入,支持大于0的正整数常量;
(2)增加常数合并操作MergeConst(E)——合并表达式E中所有常数运算。例如,对表达式E=(2+3-a)*(b+3*4)进行合并常数的操作后,求得E=(5-a)*(b+12)
【测试数据】
1) 分别输入0;a;-91;+a*bc;+*5x2*8x;+++*3^*2^x2x6并输出。
2) 每当输入一个表达式后,对其中的变量赋值,然后对表达式求值。
3) 还有很多测试的数据,详细请见附上的文件Test.txt。
代码片段和文件信息
#include“expression.h“
/*全局变量*/
int save_number[31];/*在按原表达式输入形式中,输入的常量保存到数组save_number中,常量最多为30个,0单元不用*/
char Expr_String[30];/*存放表达式的字符串*/
/*以字符序列的形式输入语法正确的前缀表达式,保存到字符串string*/
/*参数flag=0表示输出的提示信息是“请输入正确的前缀表示式:“*/
/*flag=1表示输出的提示信息为“请以表达式的原书写形式输入正确表示式:“*/
Status Input_Expr(char *stringint flag)
{
if(flag==0)printf(“\n请输入正确的前缀表示式:“);
else printf(“\n请以表达式的原书写形式输入正确表示式:“);
flushall();/*清理缓冲区*/
gets(string);/*从键盘输入一串字符串作为表达式*/
if(strlen(string)==1)/*输入的表达式字符串长度为1*/
if(string[0]==‘+‘||string[0]==‘-‘||string[0]==‘*‘||string[0]==‘/‘||string[0]==‘^‘)/*输入的表达式只有一个运算符*/
{ printf(“\n表达式只有一个字符,为运算符,错误!“);return ERROR;}
else if((string[0]>=‘0‘&&string[0]<‘9‘)||(string[0]>=‘a‘&&string[0]<=‘z‘)||(string[0]>=‘A‘&&string[0]<=‘Z‘))
/*输入的表达式只有一个数字或字符*/
{ printf(“\n表达式只有一个字符!“);return OK;}
else {printf(“\n输入的字符不是运算符也不是变量常量,错误!“);return ERROR;}
return OK;
}
/*判断字符string[i],如果是‘0‘-‘9‘常量之间,二叉树结点存为整型;否则,存为字符型*/
void judge_value(BiTree *Echar *stringint i)
{
if(string[i]>=‘0‘&&string[i]<=‘9‘)/*为常量*/
{(*E)->data.tag=INT;(*E)->data.num=string[i]-48;}
else if(string[i]>=1&&string[i]<=20)/*为常量,常量存于数组save_number中*/
{(*E)->data.tag=INT;(*E)->data.num=save_number[string[i]];}
else/*为变量*/
{(*E)->data.tag=CHAR;(*E)->data.c=string[i];}
}
/*以正确的前缀表示式并构造表达式E*/
Status ReadExpr(BiTree *Echar *exprstring)
{
SqStack S;
int ilen;/*len为表达式的长度*/
BiTree pq;
(*E)=(BiTree)malloc(sizeof(BiTNode));/*申请二叉树的根结点的空间*/
(*E)->lchild=NULL;
(*E)->rchild=NULL;
len=strlen(exprstring);/*len赋值为表达式的长度*/
if(len==1)/*表达式长度为1时,二叉树只有根结点*/
judge_value(Eexprstring0);/*将exprstring[0]存入二叉树的结点中*/
else
{
judge_value(Eexprstring0);/*将exprstring[0]存入二叉树的结点中*/
InitStack(&S);/*初始化栈*/
q=(*E);
Push(&Sq);/*入栈*/
Push(&Sq);/*入栈,根结点入栈两次是为判断先序输入的表达式是不是正确的表达式*/
for(i=1;i {
p=(BiTree)malloc(sizeof(BiTNode));
judge_value(&pexprstringi);/*将exprstring[i]存入二叉树的结点中*/
p->lchild=NULL;
p->rchild=NULL;
if(exprstring[i]==‘+‘||exprstring[i]==‘-‘||exprstring[i]==‘*‘||exprstring[i]==‘/‘||exprstring[i]==‘^‘)
{/*为运算符,运算符入栈,左孩子不空,向左孩子走,否则,如果右孩子不空,向右孩子走*/
if(!q->lchild) {q->lchild=p;Push(&Sp);q=p;}
else {q->rchild=p;Push(&Sp);q=p;}
}
else/*不是运算符,运算符出栈*/
{
if(!q->lchild) {q->lchild=p;Pop(&S&q);}
else {q->rchild=p;Pop(&S&q);}
}
}
if(StackEmpty(S)&&i>=len) return OK;/*栈空且i>=len,说明输入的表达式是正确的*/
else /*输入的表达式是错误的*/
{
printf(“\n输入的表达式有误!“);
return ERROR;
}
}
}
/*如果两个字符是运算符,比较两个运算符的优先级,c1比c2优先,返回OK,否则返回ERROR*/
Status Pri_Compare(char c1char c2)
{
if((c1==‘^‘||c1==‘*‘||c1==‘-‘||c1==‘+‘||c1==‘/‘)&&(c2==‘^‘||c2==‘*‘||c2==‘-‘||c2==‘+‘||c2==‘/‘))
{/*c1和c2为运算符*/
if(c1==‘^‘)/*c1为指数运算符,则当c2不为‘^‘时,c1比c2优先*/
{
if(c2!=‘^‘) return OK;
else return ERROR;
}
else if(c1==‘*‘||c1==‘/‘)/*c1为乘法或除法运算符,则当c2为‘+‘或
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
..A.SH. 4608 2008-07-12 14:13 数据结构课程设计-表达式类型的实现\Thumbs.db
文件 1654 2008-07-04 16:39 数据结构课程设计-表达式类型的实现\测试\测试数据.txt
..A.SH. 38400 2008-07-04 15:52 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\Thumbs.db
文件 654890 2008-07-04 13:51 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\主菜单界面.bmp
文件 99582 2008-07-04 15:44 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\合并常数操作 多次合并1.bmp
文件 100206 2008-07-04 15:45 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\合并常数操作 多次合并2.bmp
文件 97030 2008-07-04 15:45 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\合并常数操作 多次合并3.bmp
文件 432694 2008-07-04 15:42 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\合并常数操作1.bmp
文件 189198 2008-07-04 14:09 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试前缀表达式输入 -91.bmp
文件 230094 2008-07-04 14:10 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试前缀表达式输入 变量.bmp
文件 561570 2008-07-04 14:06 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试前缀表达式输入 常量.bmp
文件 191754 2008-07-04 14:12 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试前缀表达式输入 较为复杂表达式.bmp
文件 179534 2008-07-04 15:15 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试前缀表达式输入 输出带括弧.bmp
文件 143190 2008-07-04 14:17 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试前缀表达式输入 错误前缀表达式1.bmp
文件 143414 2008-07-04 14:19 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试前缀表达式输入 错误前缀表达式2.bmp
文件 194614 2008-07-04 14:55 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试原表达式输入 BUG1.bmp
文件 155970 2008-07-04 15:09 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试原表达式输入 出错处理1.bmp
文件 156214 2008-07-04 15:11 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试原表达式输入 出错处理2.bmp
文件 158774 2008-07-04 15:14 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试原表达式输入 出错处理3.bmp
文件 159270 2008-07-04 15:20 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试原表达式输入 出错处理4.bmp
文件 176694 2008-07-04 15:03 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试原表达式输入 简化括弧.bmp
文件 309814 2008-07-04 14:42 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试构造复合表达式1.bmp
文件 286774 2008-07-04 14:44 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试构造复合表达式2.bmp
文件 563254 2008-07-04 14:45 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试构造复合表达式3.bmp
文件 107238 2008-07-04 14:40 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试求算数表达式的值 带有变量.bmp
文件 311886 2008-07-04 14:36 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试求算数表达式的值1.bmp
文件 105014 2008-07-04 14:38 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试求算数表达式的值2.bmp
文件 258210 2008-07-04 14:27 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试赋值操作1.bmp
文件 261174 2008-07-04 14:29 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试赋值操作2.bmp
文件 227538 2008-07-04 14:32 数据结构课程设计-表达式类型的实现\测试\部分测试的截图\测试赋值操作3.bmp
............此处省略12个文件信息
- 上一篇:交通灯控制实验(计算机组成原理)完整版
- 下一篇:实用马尔可夫决策过程
相关资源
- 数据结构 课程设计 中缀算术表达式求
- 数据结构课程设计----表达式类型的实
- 数据结构课程设计表达式类型的实现
- 数据结构课程设计——基于链表与哈
- NET高级知识点视频
- 正则表达式工具Regex Match Tracer v2.1+注
- GNU regex 正则表达式 修正版
- 正则表达式30分钟入门教程-附常用表
- 正则表达式自动生成器 V2.0.0.1 官方多
- 表达式求值问题 数据结构
- 表达式求值 数据结构
- 数据结构课程设计之电梯模拟
- JEP--字符串表达式计算结果最强工具,
- 数据结构课程设计——哈夫曼编/译码
- 数据结构课程设计医院选址系统
- 后缀表达式计算
- 华工数据结构课程设计
- 正则表达式必知必会(中文版)
- 数据结构课程设计—家谱管理系统
- 数据结构课程设计,基于二叉排序树
- 面向对象版表达式计算器之完整源码
- 北邮数据结构课程设计-图书馆管理系
- 数据结构课程设计内部排序算法比较
- 《数据结构_课程设计》表达式求值
- The Regulator 2.0 专业正则测试工具
- 数据结构课程设计-在线交易系统
- 霍夫曼树数据结构课程设计
- 计算器计算表达式的
- 遗传算法GEP学习资料
- 利用堆栈实现数值表达式的计算
评论
共有 条评论