ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:64.93KB ,
资源ID:9282727      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9282727.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(四则运算c++实现.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

四则运算c++实现.docx

1、四则运算c+实现1、需求分析1.利用二叉树后序遍历来实现表达式的转换,同时可以使用实验3的结果来求解后缀表达式的值。2.输入输出格式:输入:在字符界面上输入一个中缀表达式,回车表示结束。输出:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。2、概要设计 抽象数据类型为实现上述程序的功能,前序遍历输入,以后序遍历输出。算法的基本思想 用一个字符串储存输入的二项式,一次读取各个字符。如果遇见数据,累乘后存入后序遍历的数组当中(将字符型转换为整数类型);如果遇见前括号,存入运算符栈中;如果遇见后括号,将

2、前括号及前括号之后的运算符全部弹出;如果遇见加减号,在运算符栈为空或下一个为括号运算符时,运算符入栈,否则,将栈顶元素存入后序遍历的数组中,再运算符入栈;如果遇见乘除号,在运算符栈为空或下一个为括号运算符时及栈内第一个元素为乘号或除号时,运算符入栈,否则,将栈顶元素存入后序遍历的数组中,再运算符入栈。程序的流程程序由三个模块组成:(1) 输入模块:输入正确的四则运算表达式。(2) 计算模块:利用栈实现四则运算。(3) 输出模块:屏幕上显示后序遍历的结果。3、详细设计物理数据类型 1、用数组存储输入的表达式和输出的表达式。2、用栈存储操作算法的具体步骤求逆序遍历的算法 算法的时空分析后序遍历的时

3、间代价为(n)空间代价为一个数组.输入和输出的格式输入:请输入中序表达式:xxx#(#结束符)输出:输出的后缀是:五、测试结果 输入:5*(3+2)!输出:5#3#2#+* The result is:25 六、用户使用说明(可选)1、“!” 结束符2、输入的包括符号请不要超过十位七、实验心得(可选)1:这次试验的优点是在不断地调试和运行之后终于实现了这个代码,完成了c+创建栈的全部过程,让我的这个小组对栈的了解有人更加深入的认识,完成了栈的所有的基本操作,但是缺点在于这次试验的代码并不是完全符合条件,没有用树的遍历实现。二叉树实现参考附录二。2:此次实验要求我们用中序输入一个四则运算的表达式

4、,计算出结果后,再通过后续遍历输出。我们组采用的是栈的方式做出了结果。 但是我跟别的组的夏晓玲讨论出了另一种想法时,先把四则运算表达式按照优先级加好括号,这样建树时一遇到括号就建这个子树,然后再返回到原来的根节点,继续往下建树。夏晓玲同学加括号的代码写了100多行,我们还在考虑有没有更简洁的写法。但是在建树的过程中出现了问题,一旦表达式过长,就会失败。这也是我们未能解决的问题。这次实验,真正是我收获最大的一次,但问题是懂得了算法,写不出代码。嗯,所以,在接下来的学习中,还要加深对代码这一块的了解和掌握。3:每次的数据结构试验,我总是抱着笨鸟先飞的心态,提早写程序,就算写不出来,也能把思路整理的

5、差不多,这样才不至于在实验室里“手足无措”本次试验是用二叉树实现将中缀表达式转化成后缀表达式输出。二叉树掌握情况不是很好的我,首先想到的还是用栈来实现。即使用栈首先要思考的还是如何进行符号优先级的判断。思路如下:case*:case/:while(op.top!=-1&op.dataop.top!=(&op.top!=*&op.dataop.top!=/)/遇到*或者/,如果这是栈中为空并且不为(并且不是*、/,则将栈顶元素赋值给数组,跳出循环,然后将给符号压入栈中。case+:case-: while(op.top!=-1&op.dataop.top!=()遇到+、-则需要判断如果栈顶不是空

6、且不是(,则将栈定元素赋给数组,跳出循环,然后将符号压入栈中遇到(压入栈中,遇到数字写入数组,遇到符号比照以上操作,遇到),将栈内符号依次输入数组,(弹出。以上是我们用栈的方案的主要思路本次题目的要求是用二叉树来实现,我暂时没有自己实现成功,但是我借鉴了以为同学的。建二叉树最首要的任务就是优先级的判断,其主要思想是,从中缀表达式的最末符号来检测其优先级。假设遇到括号,则跳过括号,遇到*/号记录其位置,若遇到+、-则替换掉*、/的位置。最终i记录的位置即为优先级最低的运算符,为二叉树的根节点,i左边的表达式调用运算符优先级判断的函数然后递归返回左子树,右侧同理。以上为二叉树方法的思想无论是用哪种

7、方式实现的,都是一次力度很强的知识点巩固。锻炼我们分析问题的深度以及细致度,更是理论应用实践的方式,所以总是尽力先自己思考,是在解决不了,那就请教“大神们”了,从中可以学到自己不会的东西。7、附录(可选)附录一:用栈实现/*测试数据:输入:5*(3+2)!输出:5#3#2#+* The result is:25*/#includeusing namespace std;/*栈的抽象类的定义*/template class stack public: virtual bool isEmpty() = 0; virtual void push(const int& d) = 0; virtual

8、int pop() = 0; virtual int top() = 0;/*顺序栈类的定义*/template class seqStack:public stack public: seqStack(int initSize = 10); /构造函数,默认栈的容量为10 bool isEmpty(); /判断栈是否为空 void push(const int& d); /进栈函数 int pop(); /出栈函数 int top(); /返回栈顶元素 seqStack(); /析构函数 / private: int *data; /栈顶指针 int maxSize; /栈的容量 int t

9、op_p; /栈顶指针 void resize(); /将栈的容量扩大一倍 int trans(char exp);/四则运算;/*顺序栈类的实现*/seqStack:seqStack(int initSize) maxSize = initSize; data = new intmaxSize; top_p = -1; cout nCreate stack success!n;bool seqStack:isEmpty() return top_p = -1;void seqStack:resize() maxSize *= 2; int* tmp = data; data = new in

10、tmaxSize; for (int i = 0; i = top_p; +i) datai = tmpi; delete tmp;void seqStack:push(const int& d) if (top_p = maxSize-1) throw 0; data+top_p = d; cout=0&ch=9) postexpj=ch; j+; ch=expi; i+; i-; postexpj=#;j+;/数字区分符 ch=expi; i+; /结束循环 while(top_p!=-1)/将运算符全部出栈 postexpj=datatop_p; j+; top_p-; postexpj

11、=0;/0结束 coutpostexpendl;/输出逆序遍历/*value函数的实现*/ float d=0; char sh; int k=0; top_p=-1; sh=postexpk; k+; while(sh!=0) switch(sh) case +: datatop_p-1=datatop_p-1+datatop_p; top_p-; break; case -: datatop_p-1=datatop_p-1-datatop_p; top_p-; break; case *: datatop_p-1=datatop_p-1*datatop_p; top_p-; break;

12、case /: if(datatop_p!=0) datatop_p-1=datatop_p-1/datatop_p; else couterror=0&sh=9)/累加 d=10*d+sh-0; sh=postexpk; k+; top_p+; datatop_p=d; sh=postexpk; k+; coutThe result is:datatop_pendl; return datatop_p;/*main函数的实现*/int main() seqStack a(10); coutplease input:; char b10; cin.getline(b,100); a.trans(b); return 0;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1