数据结构课程设计报告.docx

上传人:b****4 文档编号:1346910 上传时间:2022-10-21 格式:DOCX 页数:14 大小:293.28KB
下载 相关 举报
数据结构课程设计报告.docx_第1页
第1页 / 共14页
数据结构课程设计报告.docx_第2页
第2页 / 共14页
数据结构课程设计报告.docx_第3页
第3页 / 共14页
数据结构课程设计报告.docx_第4页
第4页 / 共14页
数据结构课程设计报告.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构课程设计报告.docx

《数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.docx(14页珍藏版)》请在冰豆网上搜索。

数据结构课程设计报告.docx

数据结构课程设计报告

《数据结构》课程设计报告

算术表达式求值系统

 

学号:

姓名:

班级:

指导教师:

成绩:

完成时间:

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

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

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

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

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