据结构实验报告 题目: 编制一个表达式求值的程序。 一. 需求分析 1. 本演示程序中,利用堆栈存储结构存储读入的运算符,输入的限定范围是数字(0—9),以及+*/()。输入字符串限定长度为20,可以根据需要进行改变。如果遇到不是以上范围或者连续输入两个运算符,如:++,则会提示输入错误,请重新输入。输出的结果是转换后的后序表达式,以及float型数字,不会含有非法字符。 2. 演示程序采用的是文件输入,只需要在源代码中输入要输入的文件的地址,然后就可以在文本文件中进行输入,运行过程中会自动读取,输出文本输入的表达式,及运算结果。 3. 程序执行的命令包括: 1) 构造字符优先级比较表,比较优先关系 2)文件输入 3)构造堆栈,运算符入栈 4)堆栈输出,变为后序表达式,并计算 5)输出结果,结束 4.测试数据 文件地址:C:\\Users\\lenovo\\Desktop\\4.txt 1) 输入:(35+20/2)*2-4/2+12 正确输出结果是:100.0000 2)输入:(35+20/2)*2-/2+12 结果是:error input 3) 输入:a+ar/3=135 结果是:error input 二.概要设计 为实现以上程序功能,需运用堆栈用于存储运算符,因此需要定义抽象数据类型。 1. 堆栈的抽象数据类型定义为: ADT stack{ 数据对象:D={ai|ai∈正整数,i=0,1,2,3,…n,及{+-*/()}} 数据关系:R1={<ai-1,a1>|ai-1,ai∈D} 基本操作: Init stack(&s) 操作结果:构造一个空的堆栈s Push stack(&s, e) 初始条件:存在堆栈s 操作结果:元素e压入堆栈s,top+1 Pop (&s,e) 初始条件:栈s已经存在且非空 操作结果:删除栈顶元素e,输出其值,top-1 2. 程序包含三个模块: 1) 运算符优先关系模块 2) 主程序模块; Int main(void){ 初始化; Do{ 接受命令; 处理命令; }while(“命令”=”退出”); } 3)堆栈模块 三.详细设计 1.程序源代码解释为: float Result(int c,float r[],int top){ //定义输出结果 int j; float temp; switch(c){ //以下是四种基本运算的计算定义,运算完成后直接将top-1值赋予top case 42:r[top-1]=r[top-1]*r[top];top=top-1;break; //乘法 case 43:r[top-1]=r[top-1]+r[top];top=top-1;break;///加法 case 45:r[top-1]=r[top-1]-r[top];top=top-1;break;//减法 case 47:r[top-1]=r[top-1]/r[top];top=top-1;break;// 除法 case 94:for(j=1,temp=r[top-1];j<r[top];j++) //平方或者几次方的运算 temp=r[top-1]*temp; //循环相乘 r[top-1]=temp; top=top-1; break; } return(r[top]); } if(temp1!=1){ while(top>=1){ //栈不空的时候,栈中元素赋给houzhi,并计数 biaozhi[b++]=i; houzhi[i]=duizhan[top-1]; top=top-1;i=i+1; } max=i; //从0到i循环输出后序表达式 for(i=0,b=0;i<max;i++){ if(i!=biaozhi[b]) printf("%d ",houzhi[i]) //输出后序表达式中的数字