数据结构表达式求值实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
竭诚为您提供优质文档/双击可除数据结构表达式求值实验报告
篇一:数据结构实验二——算术表达式求值实验报告
《数据结构与数据库》
实验报告
实验题目算术表达式求值
学院:化学与材料科学学院
专业班级:09级材料科学与工程系pb0920603
姓学
邮名:李维谷号:pb09206285箱:
指导教师:贾伯琪
实验时间:20XX年10月10日
一、需要分析
问题描述:
表达式计算是实现程序设计语言的基本问题之一,它的实现是栈的应用的一个典型例子。设计一个程序,演示通过
将数学表达式字符串转化为后缀表达式,并通过后缀表达式结合栈的应用实现对算术表达式进行四则混合运算。
问题分析:
在计算机中,算术表达式由常量、变量、运算符和括号组成。由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。因而在程序设计时,借助栈实现。
设置运算符栈(字符型)和运算数栈(浮点型)辅助分析算符优先关系。在读入表达式的字符序列的同时完成运算符和运算数的识别处理,然后进行运算数的数值转换在进行四则运算。
在运算之后输出正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。
算法规定:
输入形式:一个(:数据结构表达式求值实验报告)算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。为使实验更完善,允许操作数为实数,操作符为(、)、.(表示小数点)、+、-、*、/、^(表示乘方),用#表示结束。
输出形式:演示表达式运算的中间结果和整个表达式的最终结果,以浮点型输出。
程序功能:对实数内的加减乘除乘方运算能正确的运算出结果,并能正确对错误输入和无定义的运算报错,能连续
测试多组数据。
测试数据:正确输入:12*(3.6/3+4^2-1)#
输出结果:194.4
无定义运算:12*(3.6/(2^2-4)+1)#
输出结果:表达式出错,除数为0,无意义
错误输入:12+s#
输出结果:eRRoR!
二、概要设计
拟采用两种类型的展分别对操作数和操作符进行操作。程序中将涉及下列两个抽象数据类型:
1、设定“操作数”的栈的抽象数据类型定义:
ADTsqstack_f{
?数据对象:D={aiai?R,i?n}数据关系:
R1={|ai?1,ai?D,i=2,?,n}
约定an端为栈顶,ai端为栈底。
基本操作:
Initstack_f(??*/^?,i?n}数据关系:
R1={|ai?1,ai?D,i=2,?,n}
约定an端为栈顶,ai端为栈底。
基本操作:
Initstack_c(//存储实型数据元素的一位数组
float*top;//栈顶指针
intstacksize;//栈数组容量
}sqstack_f;//有序存储实型的顺序表类型
typedefstruct{
char*base;//存储字符数据元素的一位数组
char*top;//栈顶指针
intstacksize;//栈数组容量
}sqstack_c;//有序存储字符型的顺序表类型
voidInitstack_f(sqstack_f*s)
voidInitstack_f(sqstack_f*s)
//构造一个存储实型(字符型)的空栈,预设空间为100,分配失败就退出
voidgetTop_f(sqstack_f*s,float*e)
voidgetTop_c(sqstack_c*s,char*e)
//若栈s不空,则以e带值返栈顶元素,否则显示错误“eRRoR”,并退出程序
voidpush_f(sqstack_f*s,floate)
voidpush_c(sqstack_c*s,chare)
//在s的栈顶插入新的栈顶元素e,若栈的当前空间已满,则追加存储空间
voidpop_f(sqstack_f*s,float*e)
voidpop_c(sqstack_c*s,char*e)
//若栈s不空,则删除栈s的栈顶元素,用e带值返回,
否则退出程序
其中部分操作的伪码算法(由于比较类似,以浮点型的栈为例)
voidInitstack_f(sqstack_f*s)
{//构造一个存储实型的空栈,预设空间为100,分配失败就退出
s->base=(float*)malloc(TTAcK_InIT_sIZe*sizeof(float ));
if(!s->base)
exit(1);
s->top=s->base;
s->stacksize=TTAcK_InIT_sIZe;
}
voidgetTop_f(sqstack_f*s,float*e)
{//若栈s不空,则以e带值返栈顶元素,否则显示错误“eRRoR”,并退出程序if(s->top==s->base)
{
printf("eRRoR!\n");
exit(1);
}
*e=*(s->top-1);
}
voidpush_f(sqstack_f*s,floate)
{//在s的栈顶插入新的栈顶元素e,若栈的当前空间已满,则追加存储空间
if(s->top-s->base>=s->stacksize)
{
s->base=(float*)realloc(s->base,(s->stacksize+sTAcK IncRemenT)*sizeof(float));if(!s->base)
{
printf("oVeRFLow!\n");
exit(1);
}
s->top=s->base+s->stacksize;
s->stacksize+=sTAcKIncRemenT;
}
*s->top++=e;
}
voidpop_f(sqstack_f*s,float*e)
{//若栈s不空,则删除栈s的栈顶元素,用e带值返回,否则退出程序
if(s->top==s->base)