数据结构课程设计报告.docx
《数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告
《数据结构》课程设计报告
算术表达式求值系统
学号:
姓名:
班级:
指导教师:
成绩:
完成时间:
2011.01.02
一、设计题目描述和要求
1.问题:
现在的计算器只能对简单的数进行运算,对复杂的多项表达式不能运算
2.解决方案:
设计一个表达式求值系统
3.要求:
以字符序列的形式从终端输入语法正确的、不含变量的整数表达式。
利用下表给出的算符优先关系,实现对算术四则混合运算表达式的求值。
算术四则运算的规则:
a.从左算到右
b.先乘除,后加减
c.先括号内,后括号外
根据上述三条运算规则,在运算的每一步中,对任意相继出现的算符θ1和θ2,都要比较优先权关系,它们优先关系如下表所示。
二、系统分析与概要设计
根据问题描述和要求,系统要求能够正确求出算术表达式的值。
在进行算术表达式求值过程中,考虑到我们输入的是中缀表达式,采用后缀表达式比较容易计算,因此先将中缀表达式转换成后缀表达式。
程序应该具有:
“将算术表达式转化为后缀表达式”、“利用后缀表达式求值”等基本模块。
由于有优先级的问题,根据优先级不同的运算符运算的次序是不同的,因此
更具其优先级的大小抽象的将其定义为不同的大小。
三、详细设计和编码
1.数据类型定义
表达式求值中运算符对应优先级的定义
struct
{charch;
intpri;
}lpri[7]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},rpri[7]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};//运算符优先级的定义
运算符的存储
struct
{chardata[MaxSize];
inttop;
}op;//用栈存储运算符
2.各模块算法描述
(1)计算栈顶运算符对应的数字
NYNY
(2)判断优先级
YNYN(3)中缀转为后缀NYYNNYYNYNYNNY(4)后缀表达式求值YNYNYNYNYNYNYN(5)主函数
四、调试分析
写程序容易调程序难,调试要求:
不仅要有很好的阅读程序的能力,更要有理解,分析和纠错能力。
这次在调试过程中发现就是偶尔能运行成功,偶尔不能,只要不用加减就能成功,一旦用加减就运行不了。
最后发现原来加与减弄反了。
五、测试结果
进入多项式求值系统
请输入表达式:
4+5*6-2
中缀表达式:
4+5*6-2
后缀表达式:
4#5#6#*+2#-
表达式的值:
32
Q键退出,其它键继续
请选择:
h
进入多项式求值系统
请输入表达式:
(56-20)/(6-2)-5
中缀表达式:
(56-20)/(6-2)-5
后缀表达式:
56#20#-6#2#-/5#-
表达式的值:
4
Q键退出,其它键继续
请选择:
q
Pressanykeytocontinue
六、小结
利用表达式求值的过程中思路是:
输入的是中缀表达式,为了便于求值,先将中缀表达式转换成后缀表达式,再利用后缀表达式求值。
在转换的过程中,考到了优先级,因此要对运算符号设定对应的值,就算是虚拟值吧。
在编程的过程中,要细心,耐心,遇到问题不要急。
七、附录
#include
#include
#include
#defineMaxSize30
struct//设定运算符优先级
{
charch;
intpri;
}
lpri[]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},
rpri[]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};
intleftpri(charop)//求左运算符op的优先级
{
for(inti=0;i<7;i++)
if(lpri[i].ch==op)returnlpri[i].pri;
}
intrightpri(charop)//求右运算符op的优先级
{
for(inti=0;i<7;i++)
if(rpri[i].ch==op)returnrpri[i].pri;
}
intInOp(charch)//判断ch是否为运算符
{
if(ch=='('||ch==')'||ch=='+'||ch=='-'||ch=='*'||ch=='/')
return1;
else
return0;
}
intPrecede(charop1,charop2)//op1和op2运算符优先级的比较结果
{
if(leftpri(op1)==rightpri(op2))
return0;
elseif(leftpri(op1)return-1;
else
return1;
}
voidtrans(char*exp,charpostexp[])//将算术表达式exp转换为后缀表达式postexp
{
charst[MaxSize];
inttop=-1;
inti=0;//i作为postexp的下标
top++;//'='进栈
st[top]='=';
while(*exp!
='\0')
{
if(!
InOp(*exp))//为数字字符
{
while(*exp>='0'&&*exp<='9')
{
postexp[i++]=*exp;
exp++;
}
postexp[i++]='#';//数值串结束的标志
}
else//为运算符
{
switch(Precede(st[top],*exp))
{
case-1:
//栈顶运算符的优先级低
top++;
st[top]=*exp;//进栈
exp++;//继续扫描其他字符
break;
case0:
//只有括号满足这种情况
top--;//栈顶元素退栈
exp++;
break;
case1:
//退栈并输出到postexp中
postexp[i++]=st[top];
top--;
break;
}
}
}
while(st[top]!
='=')//此时ex