欢迎来到天天文库
浏览记录
ID:56525719
大小:243.00 KB
页数:15页
时间:2020-06-27
《用两种方式实现表达式自动计算.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、数据结构(双语)——项目文档报告用两种方式实现表达式自动计算专业:计算机科学与技术班级:14接计指导教师:姓名:学号:目录一、设计思想……………………………………………………….03二、算法流程图…………………………………………………….04三、源代码………………………………………………………….06四、运行结果……………………………………………………….13五、遇到的问题及解决…………………………………………….14六、心得体会……………………………………………………….15一、设计思想1.中缀转换后缀:⑴定义
2、两个栈S1,与S2。S1主要管转换专用,S2主要管计算专用。⑵扫描字符串,如果是字符或者小数的,直接进栈。⑶如果是“(”,同直接进栈,直到遇到“)”,为止。⑷开始处理运算符。⑸如果栈定的运算符的优先级低于读到的那个,那么就直接进栈,否则把栈里的都进数组里。⑹运算完,直到读完为止。返回字符数组,后缀表达式就出来了。⑺然后计算后缀表达。⑻开始依次扫描数组,如果是数,就进栈,如果是运算符,那么就把栈的数弹出一个,赋值给一个变量,再弹一个赋值一个变量,再进行计算,完后再进栈。⑼重复过程,直到度完。栈顶元素就是最终结果。⑽
3、结束。2.中缀直接计算:⑴如果获取的操作符a的优先级高于操作符栈栈顶元素b的优先级,则a直接入操作符栈;⑵如果获取的操作符a的优先级低于操作符栈栈顶元素b的优先级,则b出栈,a进栈,并且取出操作数栈的栈顶元素m,再取出操作数栈新的栈顶元素n,如果b为+,则用n+m,若为减号,则n-m,依此类推,并将所得结果入操作数栈;⑶如果获取的是“(”,则直接进操作符栈;⑸如果获取的是“)”,则操作符栈的栈顶元素出栈,做类似于情况2的计算,之后把计算结果入操作数栈,再取操作符栈顶元素,如果不是“(”,则出栈,重复操作,直到操作
4、符栈顶元素为“(”,然后“(”出栈;⑹当表达式中的所有元素都入栈后,看操作符栈中是否还有元素,如果有,则做类似于情况2的计算,并将结果存入操作数栈,则操作数栈中最终的栈顶元素就是所要求的结果。二、算法流程图1.后缀开始用户输入表达式将表达式存入到数组exp[]构造一个操作符栈和一个存放后缀表达式的数组从exp中获取元素cc是否为数存入后缀数组中是否为+-*/或%优先级是否高于操作符栈栈顶元素优先级进操作数栈操作符栈里栈顶元素出栈,并存入到后缀数组中,然后从数组里取的元素入操作符栈是否为“(”进操作符栈操作符栈里元
5、素出栈,并依次存入到后缀数组中,直到栈顶元素为“(”,“(”出栈数组内元素是否取尽操作符栈内元素全部出栈,并依次存入到后缀数组中,则得后缀表达式结束2.中缀直接计算开始从后缀数组中获取元素是否为数存入操作数栈中为操作符,则从操作数栈中取值作相应操作后缀数组中是否还有元素栈里最终栈顶元素即为最终结果结束三、源代码1.后缀表达式#include#include#include#include#include#include6、orithm>#include"fstream.h"#defineMAXN1000usingnamespacestd;stackS1;//定义栈S1,转换专用stackS2;//定义栈S2,计算专用char*tranfExp(char*exp)//变换后缀{chartempStr[1000];//保存后缀表达式的字符串charch;inti=0,j=0;inta=0;//标记表达式是否正确专用///intb=0;//标记数字格式是否正确待用while(exp[i]!=' '){if(7、(exp[i]>='0'&&exp[i]<='9')8、9、exp[i]=='.')//数字直接进字符串{tempStr[j++]=exp[i];//tempStr[j]='';}elseif(exp[i]=='(')//左括号蹦进栈S1{S1.push(exp[i]);}elseif(exp[i]==')')//如果是右括号,就把左括号后面的运算符都进字符串{while(S1.empty()==false){tempStr[j++]=S1.top();//括号里进数组S1.pop();//进一个,蹦一个if(S1.10、top()=='('){S1.pop();//蹦出去‘(’break;}}}elseif(exp[i]=='+'11、12、exp[i]=='-')//如果遇到了加后者减号{while(S1.empty()==false){ch=S1.top();if(ch=='+'13、14、ch=='-'15、16、ch=='(')//与栈顶比较优先级,同级直接进栈{S1.push(exp[i]);brea
6、orithm>#include"fstream.h"#defineMAXN1000usingnamespacestd;stackS1;//定义栈S1,转换专用stackS2;//定义栈S2,计算专用char*tranfExp(char*exp)//变换后缀{chartempStr[1000];//保存后缀表达式的字符串charch;inti=0,j=0;inta=0;//标记表达式是否正确专用///intb=0;//标记数字格式是否正确待用while(exp[i]!=' '){if(
7、(exp[i]>='0'&&exp[i]<='9')
8、
9、exp[i]=='.')//数字直接进字符串{tempStr[j++]=exp[i];//tempStr[j]='';}elseif(exp[i]=='(')//左括号蹦进栈S1{S1.push(exp[i]);}elseif(exp[i]==')')//如果是右括号,就把左括号后面的运算符都进字符串{while(S1.empty()==false){tempStr[j++]=S1.top();//括号里进数组S1.pop();//进一个,蹦一个if(S1.
10、top()=='('){S1.pop();//蹦出去‘(’break;}}}elseif(exp[i]=='+'
11、
12、exp[i]=='-')//如果遇到了加后者减号{while(S1.empty()==false){ch=S1.top();if(ch=='+'
13、
14、ch=='-'
15、
16、ch=='(')//与栈顶比较优先级,同级直接进栈{S1.push(exp[i]);brea
此文档下载收益归作者所有