




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
表达式计算1、问题描述与分析二级标题 算数表达式一般都写成中缀形式,即运算符总是出现在两个操作数之间(单目运算符除外),称为中缀表达式。编译系统对中缀表达式的处理方法是先把它转换为后缀表达式。在后缀表达式中,运算符位于两个操作数的后面,并且没有括号,其运算符次序就是其执行计算的次序。后缀表达式计算过程的规则非常简单:从左到右依次扫描,当读到运算符时,就对该运算符前面的两个操作数执行相应的运算,直至得到表达式的结果。本程序主要模拟编译系统计算中缀表达式的过程,先将中缀表达式转换成相应的后缀表达式,再根据后缀表达式计算出表达式的值。这个问题的解决主要是栈的一个应用。因为本程序仅是模拟,没有判断输入的中缀表达式是否合法,容错性不强,另外也仅能对一位数的中缀表达式进行转换和计算,功能上还有许多局限性,本程序处理的中缀表达式中仅允许出现六种运算符,且都是双目运算符。2、数据结构设计和基本算法设计方法的选择2.1 中缀表达式转换成后缀表达式三级标题,段前段后不空行为完成中缀表达式转换成相应的后缀表达式,设计了infix2postfix类。为了方便用户使用,它只有4个接口函数,包括两个构造函数,一个设置中缀表达式的函数setInfixExp和一个返回后缀表达式的函数postfixExp。所有表达式均采用string来存储,运算符用堆栈来临时存储,并用map的数据结构来定义优先级。下面给出了infix2posfix类的声明和部分定义。class infix2postfixpublic: infix2postfix(); infix2postfix(const string& infixExp):infix(infixExp); void setInfixExp(const string& infixExp)infix=infixExp; string postfixExp(); private: string infix; /用于转换的中缀表达式 string postfix; /后缀表达式 stack stk;/用于存储运算符的堆栈 map oper_prio;/用于存储运算符的优先级 void set_priority(); /设置运算符(+,-,*,/,%,)的优先级;中缀表达式转换成后缀表达式功能的实现是栈的一个典型应用,主要应用栈的“后进先出”的特性及预先设计好的运算符优先级。在转换过程中设置了下运算符栈。本程序的栈直接使用了C+标准模板库STL提供的stack容器。2.2 根据后缀表达式计算出表达式的值设计了postfixEval类来实现后缀表达的计算,它只有3个接口函数以方便用户调用。这3个公有函数分别为默认的构造函数、设置后缀表达式的函数setPostfixExp,计算后缀表达式的函数evaluate。下面给出了postfixEval类的声明和部分定义。/*postfixEval类的声明*/class postfixEvalpublic: postfixEval(); /设置后缀表达式 void setPostfixExp(const string& postfixExp)postfix=postfixExp; /计算后缀表达式并返回其值 int evaluate();private: string postfix;/待求值的后缀表达式 stackstk; void getOperands(int&left,int&right);/从堆栈中取得左右操作数 int compute(int left,int right,char op) const; bool isOperator(char ch) const;/判断是否为运算符;后缀表达式的计算也是栈的典型应用,在计算过程中需要设置一个操作数栈。3、软件结构设计由于本程序主要是实现模拟表达式的计算,因此主要有两个功能模块:中缀表达式转换成后缀表达式和根据后缀表达式计算出表达式的值。如果是解决某一问题,在此可不必给出功能模块图,只有类似于学生成绩管理系统这类题目应该给出功能模块图,其他的只需要叙述清楚有什么功能即可。4、算法设计与实现4.1 中缀表达式转换成后缀表达式的算法设计中缀表达式转换成后缀表达式的步骤为:1)设置一个运算符栈,初始时效地栈顶运算符置为#。2)按顺序扫描中缀表达式,当输入为操作数时就将其输出到后缀表达式中。3)当输入为运算符时,则比较输入运算符和栈顶运算符的优先级。若输入运算符的优先级高于栈顶运算符的优先级,则将输入运算符入栈;否则,栈顶运算符的优先级高于或等于输入运算符的优先级,弹出栈顶运算符至后缀表达式,然后重新比较输入运算符和更新后的栈顶运算符的优先级。4)当输入运算符为(时,直接将(入栈。5)当输入运算符为)时,将栈顶运算符出栈至后缀表达式,直至栈顶为(时,将(出栈并抛弃,同时)也抛弃。6)中缀表达式扫描完毕后,将运算符栈依次出栈至后缀表达式直至栈顶为#时停止。具体定义如下:string infix2postfix:postfixExp() postfix = ; set_priority(); stk.push(#); int i = 0; string input,topstk; for(;ioper_priotopstk)/比运算符栈顶运算符的优先级高 if(pare()=0) /若待输入的运算符为),pop出栈直至(,否则直接入栈 while(pare()!=0) postfix+=topstk; stk.pop(); topstk=stk.top(); stk.pop(); else stk.push(input); else/比运算符栈顶运算符的优先级低 if(pare()!=0) /若待输入的运算符不为(,pop出栈直到遇到栈顶运算符的优/先级高的情况,否则直接入栈 postfix+=topstk; stk.pop(); continue; stk.push(input); +i; topstk=stk.top(); while (pare(#)!=0) postfix+=topstk; stk.pop(); topstk=stk.top(); return postfix; 4.2 计算后缀表达式的算法设计后缀表达式计算的算法:设置一个用于存放操作数的栈,从左到右依次扫描后缀表达式,每读入一个操作数就将其入栈,每读入一个运算符就从操作数栈中取出两个栈顶元素施以该运算操作,并将运算结果作为新的操作数入栈。重复此过程直至将后缀表达式读完。最后,栈顶操作数即为该后缀表达式的运算结果。具体定义如下:int postfixEval:evaluate() int i,left,right,expValue; char ch; /扫描后缀表达式直至表达式结束 for(i=0;ipostfix.length();i+) ch=postfixi;/取得当前字符 if (isdigit(ch) /如果为操作数,压入操作数栈 stk.push(ch-0); else if(isOperator(ch) /若为运算符则取出其前两个操作数执行运算,并将结果压入操作数栈 getOperands(left,right); stk.push(compute(left,right,ch); expValue = stk.top();stk.pop();/操作数的栈顶即为最后的运算结果 return expValue;5号字体,单倍行距5、调试分析下面是中缀表达式计算的测试函数主体部分,它测试了中缀表达式转换成后缀表达式类infix2postfix,和后缀表达式的计算类postfixEval的使用情况。int main(int argc, char *argv) string infix,postfix; infix2postfix iexp; postfixEval pexp; cout*本程序模拟一位数的中缀表达式转化为后缀表达式及其运算*endl; cout请输入一个一位数的中缀表达式(q to quit!):infix; while(pare(q)!=0) cout你输入的中缀表达式为:infixendl; iexp.setInfixExp(infix); postfix = iexp.postfixExp(); cout其相应的后缀表达式为postfixendl; pexp.setPostfixExp(postfix); cout表达式的运算值=pexp.evaluate()endlendl; cout请再输入一个一位数的中缀表达式(q to quit!):infix; return 0;运行结果如图5-1所示。图5-1 程序运行截图6、总结一定要根据自己的所思所想进行总结,这部分要重点写好。1)综合实践过程的收获;2)遇到问题以及解决问题的思路和方法;3)程序调试能力的思考 ;4)在综合实践设计过程中对数据结构与算法分析课程的认识等内容。附录:程序代码清单#include 五号字体,单倍行距#include #include #include using namespace std;/*infix2postfix类的声明*/class infix2postfixpublic: infix2postfix(); infix2postfix(const string& infixExp):infix(infixExp); void setInfixExp(const string& infixExp)infix=infixExp; string postfixExp(); private: string infix; /用于转换的中缀表达式 string postfix; /后缀表达式 stack stk;/用于存储运算符的堆栈 map oper_prio;/用于存储运算符的优先级 void set_priority(); /设置运算符(+,-,*,/,%,)的优先级;/*postfixEval类的声明*/class postfixEvalpublic: postfixEval(); /设置后缀表达式 void setPostfixExp(const string& postfixExp)postfix=postfixExp; /计算后缀表达式并返回其值 int evaluate();private: string postfix;/待求值的后缀表达式 stackstk; void getOperands(int&left,int&right);/从堆栈中取得左右操作数 int compute(int left,int right,char op) const; bool isOperator(char ch) const;/判断是否为运算符; void infix2postfix:set_priority() oper_prio# = 1; oper_prio( = 2; oper_prio+ = 3; oper_prio- = 3; oper_prio* = 4; oper_prio/ = 4; oper_prio% = 4; oper_prio = 5; oper_prio) = 6; /求取并返回后缀表达式string infix2postfix:postfixExp() postfix = ; set_priority(); stk.push(#); int i = 0; string input,topstk; for(;ioper_priotopstk)/比运算符栈顶运算符的优先级高 if(pare()=0) /若待输入的运算符为),pop出栈直至(,否则直接入栈 while(pare()!=0) postfix+=topstk; stk.pop(); topstk=stk.top(); stk.pop(); else stk.push(input); else/比运算符栈顶运算符的优先级低 if(pare()!=0) /若待输入的运算符不为(,pop出栈直到遇到栈顶运算符的/优先级高的情况,否则直接入栈 postfix+=topstk; stk.pop(); continue; stk.push(input); +i; topstk=stk.top(); while (pare(#)!=0) postfix+=topstk; stk.pop(); topstk=stk.top(); return postfix; int postfixEval:evaluate() int i,left,right,expValue; char ch; /扫描后缀表达式直至表达式结束 for(i=0;ipostfix.length();i+) ch=postfixi;/取得当前字符 if (isdigit(ch) /如果为操作数,压入操作数栈 stk.push(ch-0); else if(isOperator(ch) /若为运算符则取出其前两个操作数执行运算,并将结果压入操作数栈 getOperands(left,right); stk.push(compute(left,right,ch); expValue = stk.top();stk.pop();/操作数的栈顶即为最后的运算结果 return expValue; void postfixEval:getOperands(int& left,int& right) right = stk.top(); stk.pop(); left = stk.top(); stk.pop();int postfixEval:compute(int left,int right,char op) const int value; switch(op) case +:value = left+right; break; case -:value = left-right; break; case *:value = left*right; break; case /:if (right = 0) coutpostfixEval出现 除0 错误endl; value = left/right; break; case %:if (right = 0)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业业务转让合同样本
- 企业出租土地合同样本
- 关于托管转让合同样本
- 2025借款转让合同律师拟定版本
- 介绍学员提成居间合同标准文本
- 个人签合同范例
- 企业总部跳槽合同标准文本
- 供水材料供货合同标准文本
- 公司多人股合同样本
- 个人出国务工合同样本
- 机床电气控制技术(齐占庆)第一章-答案
- 2024官方兽医考试更新题库及答案
- 动物检疫员防疫员考试题库与答案(新版)
- 气压传动课件 项目八任务一 公共汽车门气压传动系统
- DB42-T 2275-2024 消防给水设施物联网系统技术标准
- 七律长征读书分享 课件
- 2024年新物业管理技能及理论知识考试题与答案
- 《工程经济学》题集
- 《直播运营实务》 课件 5.3直播间场景搭建
- 2024汽车行业社媒营销趋势【微播易CAA中国广告协会】-2024-数字化
- NB/T 11440-2023生产煤矿储量估算规范
评论
0/150
提交评论