logo资料库

算术表达式的求解(数据结构).doc

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
数据结构课程设计报告 设计题目: 算术表达式的求解 学生姓名: 专 业: 计算机科学与技术 班 级: 学 号: 完成日期: 2011 年 12 月 24 日 合肥工业大学计算机与信息学院 1
(一) 需求和规格说明 设计一个模拟计算器的程序,要求能对包含加、减、乘、除、括号运算符及 SQR和ABS函数的任意整型表达式进行求解。 要求:要检查有关运算的条件,并对错误的条件产生报警。 (二) 设计目的 1. 调研并熟悉表达式求解的基本功能、数据流程与工作规程; 2. 学习编译原理、基于 VC++集成环境的编程技术; 3. 通过实际编程加深对基础知识的理解,提高实践能力; 4. 学习开发资料的收集与整理,并学会撰写课程设计报告。 (三) 设计方案 本程序采用的是将中缀表达式转化为后缀表达式的方法进行求解。 1. 中缀表达式转换为后缀表达式的算法思想: ·建立一个栈 s; ·对中缀表达式开始扫描; ·数字时,加入后缀表达式; ·运算符: a. 若为最高级的运算符,入栈; b. 若为 '(',入栈; c. 若为 ')',则依次把栈中的的运算符加入后缀表达式中,直到出 现'(',从栈中删除'(' ; d. 若为不是最高级的运算符,则将从栈顶到第一个优先级不大于 (小于,低于或等于)它的运算符(或 '(',但优先满足前一个条件)之间的运 算符加入后缀表达式中,该运算符再入栈; ·当扫描的中缀表达式结束时,栈中的的所有运算符出栈。 2. 运用后缀表达式进行计算的具体做法: 建立一个栈 r。从左到右读后缀表达式,如果读到操作数就将它压入栈 r 中,如果读到 n 元运算符(即需要参数个数为 n 的运算符)则取出由栈顶向下的 n 项按操作符运算,再将运算的结果代替原栈顶的 n 项,压入栈 r 中 。如果后缀 表达式未读完,则重复上面过程,最后输出栈顶的数值则为结束。 2
流程图: 开始 输入表达式 扫描并判断扫 描是否结束 N Y a[i]是否为数字 Y N 通过转换并存 入 que rc 若为最高级的运算符,入栈;若为 '(', 入栈;若为 ')',则依次把栈中的的运算 符加入后缀表达式中,直到出现'(',从栈 中删除'(' ;若为不是最高级的运算符, 则将从栈顶到第一个优先级不大于它的 运算符之间的运算符加入后缀表达式 中,该运算符再入栈 i++ 调用 stai r 存放好 的后缀表达式 后 缀 表 达 式结 果 的 计 算 result() 输出运算结果 结束 3
(四)运行实例 (五)面对的问题 只能进行正整数的一些简单的四则运算和次方运算,不能接受负数及 abs,log,sqrt,sin,cos 等函数。同时,在编写的过程中,若能模仿计算器的输 入界面进行数值和运算符的输入,则更能体现出本次课程设计的设计要求和使用 者的需要。 代码部分: #include #include #define max 100000000; using namespace std; int isp(char c){//栈内符号的优先级 switch (c){ 4
int icp(char c){//栈外符号的优先级 case '(':return 1; case '[':return 1; case '*':return 5; case '/':return 5; case '^':return 6; case '+':return 3; case '-':return 3; case ')':return 8; case ']':return 8; } } switch (c){ case '(':return 8; case '[':return 8; case '*':return 4; case '/':return 4; case '^':return 7; case '+':return 2; case '-':return 2; case ')':return 1; case ']':return 1; } } char a[100]; char c[100]; class stac{//符号栈 private: char s[100]; int t; public: if(t==0) return 1; else return 0; stac(){ t=0; } int empty(){ } char pop(){ if(t>0){ t--; return s[t]; } 5
} void push(char c){ s[t]=c; t++; } char gettop(){ return s[t-1]; } }; public: int s[100]; int t; stai(){ t=0; } int empty(){ class stai{//后缀表达式转换和计算 private: if(t==0) return 1; else return 0; } int pop(){ if(t>0){ t--; return s[t]; } } void push(int c){ s[t]=c; t++; } int gettop(){ return s[t-1]; } }; class que{ private: int s[100]; int b; int t; public: que(){ 6
t=0; b=0; } int empty(){ } int pop(){ if(b!=t){ if(t==0) return 1; else return 0; b=(b+1)%100; return s[(b+99)%100]; } } void push(int c){ s[t]=c; t=(t+1)%100; } int gettop(){ return s[b]; } void clean(){ b=0; t=0; } }; que rc; void mtof (){//对表达式进行扫描并入栈 stac s; int j=0; int tm=0; for(int i=0;i
} i++; } else{ s.push(a[i]); i++; } else{ if(s.empty()||icp(a[i])>isp(s.gettop())) { while(icp(a[i])
分享到:
收藏