北京理工大学数据结构与算法设计实验二_第1页
北京理工大学数据结构与算法设计实验二_第2页
北京理工大学数据结构与算法设计实验二_第3页
北京理工大学数据结构与算法设计实验二_第4页
北京理工大学数据结构与算法设计实验二_第5页
已阅读5页,还剩8页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.数据结构与算法设计实验报告实验二学院:自动化学院班级: 06111001 学号: 1120100001姓名: 宝竞宇 一、 实验目的 掌握栈的建立,输入,删除,出栈等基本操作。应用栈解决实际问题。二、实验内容 实现简单计算器的功能,请按照四则运算加、减、乘、除、幂()和括号的优先关系和惯例,编写计算器程序。要求支持运算符:+、-、*、/、%、()和=: 从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志; 输入表达式中的数值均为大于等于零的整数,如果中间计算过程中出现小数也只取整进行计算。例如,输入:4+2*5=输出:14 输入:(4+2)*(2-10)=输出:-48三、程序设计 1

2、、概要设计 抽象数据类型定义:两个栈结构,分别用来储存数据和计算符号 宏定义:函数“胜利”,“失败的返回值” 在主程序程序中先依次输入各表达式,存入相应各栈,然后 ,调用“判断函数来判断计算符的优先次序,然后再利用计算函数来计算,表达式值。其中还有,取栈顶元素函数,存入栈函数。 2、详细设计数据类型实现:struct tchar dat200; int top;prt;入栈函数:存入数组,栈顶指针上移void pushd(long int a)prd.datprd.top+=a;出栈:取出对应值,栈顶指针下移 long int popd( )return prd.dat-prd.top;比较优

3、先级:建立数组,比较返回大于小于号。计算函数:以字符型输入,运算符号,用switch来分支计算判断,返回计算数值 long int operation ( long int x, long int y, char a) switch(a)case '+': return x+y;case '-': return x-y;case '*': return x*y;case '/': if ( y ) return x/y; else printf("Divide 0.n"); return 0; case 

4、9;%': return (long int) fmod(x,y);case '': if (y>=0 ) return (long int) pow(x,y); else return (0);default: printf("Error No. 3n"); return 0; 主程序:在主程序内,以字符串的形式输入表达式,然后分别调用函数存入各相应栈,然后用数组判断,比较运算符的优先顺序。依次输入,当要输入的算符优先级比已经在栈顶的优先级低,则取出运算。while ( *p!='#' | prt.datprt.top-1!=

5、'#' )以#号作为结束的标志。switch ( refusal(prt.datprt.top-1, *p ) )用来比较优先级主函数流程图: 开 始 循环模块输入表达式各项 存入模块存入 判断模块是否计算 输出栈顶值结 束四、程序调试分析 在程序调试过程中,对实验的步骤并不是非常熟悉,导致实验的过程中对基本的计算器栈的应用不好。其原理是依次读入表达式的每一个字符,把数字和运算符分别存在两个不同的栈中,当要读入的运算符比已经在栈中的运算符优先级低时,则取出运算,然后把结果存入数栈。优先级的关系一开始不知道怎么建立,后来想到了二维数组,然后在计算操作函数的编写上,出现了问题,最后

6、想到了应用switch。栈的进出和链表的区别还是很大的,在这次实验中我学会掌握了,栈的创立,和存入,出栈等操作,掌握了有关知识。同时比较了,链表与栈之间的区别和联系。五、用户使用说明 运行程序,程序对话框会显示“Expression=”然后输入表达式,按回车得出结果,然后按任意键退出程序。六、程序运行结果 七、程序清单#include <stdio.h>#include <math.h>#include <string.h>#define W 0x00char chinput200, *p; /* 运算式存储字符串 */* 运算式当前读取位置 */struc

7、t FUHAO/* 建符号栈 */char dat200;int top;prt;struct SHU/* 建数字栈 */long int dat200;int top;prd;char PRI99='>','>','<','<','<','<','<','>','>','>','>','<','<','

8、<','<','<','>','>','>','>','>','>','<','<','<','>','>','>','>','>','>','<','<','

9、<','>','>','>','>','>','>','>','<','<','>','>','>','>','>','>','>','<','<','>','

10、>','<','<','<','<','<','<','<','=', W ,'>','>','>','>','>','>',W, '>','>' ,'<','<','<',

11、'<','<','<','<', W ,'=' ;/*优先级列表*/void pushd(long int a)/* 数字入栈 */prd.datprd.top+=a;void pusht(char a)/* 符号入栈 */prt.datprt.top+=a;long int popd( )/* 数字出栈 */return prd.dat-prd.top;char popt( )/* 符号出栈 */return prt.dat-prt.top;long int numble ( )/* 数字

12、整理 */long int b=0;dob = b*10 + *p -'0'p+;while ( *p>='0' && *p<='9' ) ;return b;long int operation ( long int x, long int y, char a) /* 数学运算 */switch(a)case '+': return x+y;case '-': return x-y;case '*': return x*y;case '/': if (

13、y ) return x/y; else printf("Divide 0.n"); return 0; case '%': return (long int) fmod(x,y);case '': if (y>=0 ) return (long int) pow(x,y); else return (0);default: printf("Error No. 3n"); return 0;int signswitch ( char a )/* 符号转换 */char signs= '+', '

14、;-', '*', '/', '%', '', '(', ')', '#', '0' ;int k;k = 0;while ( signsk!='0' && signsk != a )k+;if ( signsk = a ) return k;else return -1;char refusal ( char a,char b ) /* 判定优先级 */return PRIsignswitch(a)signswitch(b);

15、int main( )int j, k, l, flag=0; /* flag=0前一个符号不是) */char b;prt.dat0='#'prt.top=1;prd.top=0;printf ("Enter Expression=");scanf("%s", chinput); /* 接收运算式 */strcat( chinput, "#" ); /* 在运算式结尾加#号 */p = chinput;while ( *p!='#' | prt.datprt.top-1!='#' )i

16、f ( *p>='0' && *p<='9') j = numble();/* 如果是数字进行整理并入栈 */pushd(j);else /* 如果是符号与栈顶的符号比较并运算 */ if ( flag=1 && *p='(' ) printf("Error No.1:%sn", p); return 0;else if ( *p=')') flag=1; else flag=0;switch ( refusal(prt.datprt.top-1, *p ) )case '<': pusht ( *p+ ); /* 当前运算符优先级高则运算符入栈 */break; /*处理下一个字符*/case '=': popt( ); /* 脱括号 */ p+; break;case '>': b=popt( ); /* 当前运算符优先级低

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论