四则运算c++实现Word文档下载推荐.docx
- 文档编号:13706198
- 上传时间:2022-10-13
- 格式:DOCX
- 页数:11
- 大小:36.42KB
四则运算c++实现Word文档下载推荐.docx
《四则运算c++实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《四则运算c++实现Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
利用栈实现四则运算。
(3)输出模块:
屏幕上显示后序遍历的结果。
三、详细设计
物理数据类型
1、用数组存储输入的表达式和输出的表达式
2、用栈存储操作
算法的具体步骤
求逆序遍历的算法
算法的时空分析
后序遍历的时间代价为O(n)
空间代价为一个数组.
输入和输出的格式
请输入中序表达式:
xxx#(#结束符)
输出的后缀是:
五、测试结果
5*(3+2)!
5#3#2#+*
Theresultis:
25
六、用户使用说明(可选)
1、“!
”结束符
2、输入的包括符号请不要超过十位
七、实验心得(可选)
1:
这次试验的优点是在不断地调试和运行之后终于实现了这个代码,完成了C++创建栈
的全部过程,让我的这个小组对栈的了解有人更加深入的认识,完成了栈的所有的基本操作,但是缺点在于这次试验的代码并不是完全符合条件,没有用树的遍历实现。
二叉树实现参考附录二。
2:
此次实验要求我们用中序输入一个四则运算的表达式,计算出结果后,再通过后续遍历输出。
我们组采用的是栈的方式做出了结果
但是我跟别的组的夏晓玲讨论出了另一种想法时,先把四则运算表达式按照优先级加好括号,这样建树时一遇到括号就建这个子树,然后再返回到原来的根节点,继续往下建树。
夏晓玲同学加括号的代码写了100多行,我们还在考虑有没有更简洁的写法。
但是在建树的过程中出现了问题,一旦表达式过长,就会失败。
这也是我们未能解决的问题。
这次实验,真正是我收获最大的一次,但问题是懂得了算法,写不出代码。
嗯,所以,在接下来的学习中,还要加深对代码这一块的了解和掌握。
3:
每次的数据结构试验,我总是抱着笨鸟先飞的心态,提早写程序,就算写不出来,也能把思路整理的差不多,这样才不至于在实验室里“手足无措”
本次试验是用二叉树实现将中缀表达式转化成后缀表达式输出。
二叉树掌握情况不是很好的我,首先想到的还是用栈来实现。
即使用栈首先要思考的还是如何进行符号优先级的判断。
思路如下:
case'
*'
:
/'
while(op.top!
=-
1&
&
op.data[op.top]!
='
('
op.top!
)//遇到‘*'
或者
‘/'
如果这是栈中为空并且不为‘('
并且不是‘*'
、‘/'
,则将栈顶元素赋值给数组,
跳出循环,然后将给符号压入栈中。
+'
-'
while(op.top!
=-1&
)
遇到‘+'
、‘-'
则需要判断如果栈顶不是空且不是‘('
,则将栈定元素赋给数组,跳出循环,然后将符号压入栈中
遇到‘('
压入栈中,遇到数字写入数组,遇到符号比照以上操作,遇到‘)'
,将栈内符号依次输入数组,‘('
弹出。
——————————————以上是我们用栈的方案的主要思路
本次题目的要求是用二叉树来实现,我暂时没有自己实现成功,但是我借鉴了以为同学的。
建二叉树最首要的任务就是优先级的判断,其主要思想是,从中缀表达式的最末符号来检测其优先级。
假设遇到括号,则跳过括号,遇到‘*'
号记录其位置,若遇到‘+'
则替换掉‘*'
的位置。
最终i记录的位置即为优先级最低的运算符,
为二叉树的根节点,i左边的表达式调用运算符优先级判断的函数然后递归返回左子树,右侧同理。
——————————————————以上为二叉树方法的思想
无论是用哪种方式实现的,都是一次力度很强的知识点巩固。
锻炼我们分析问题的深度以及细致度,更是理论应用实践的方式,所以总是尽力先自己思考,是在解决不了,那就请教“大神们”了,从中可以学到自己不会的东西。
七、附录(可选)
附录一:
用栈实现
测试数据:
5#3#2#+
******************************************************************************
**/
#include
usingnamespacestd;
栈的抽象类的定义
//template
classstack{
public:
virtualboolisEmpty()=0;
virtualvoidpush(constint&
d)=0;
virtualintpop()=0;
virtualinttop()=0;
};
顺序栈类的定义
classseqStack:
publicstack{
10
seqStack(intinitSize=10);
//构造函数,默认栈的容量为
boolisEmpty();
//判断栈是否为空
voidpush(constint&
d);
//进栈函数
intpop();
//出栈函数
inttop();
//返回栈顶元素
~seqStack();
//析构函数
//private:
int*data;
//栈顶指针
intmaxSize;
//栈的容量
inttop_p;
顺序栈类的实现
seqStack:
seqStack(intinitSize){maxSize=initSize;
data=newint[maxSize];
top_p=-1;
cout
}
boolseqStack:
isEmpty(){
returntop_p==-1;
voidseqStack:
resize(){
maxSize*=2;
int*tmp=data;
data=newint[maxSize];
for(inti=0;
i
data[i]=tmp[i];
deletetmp;
push(constint&
d){if(top_p==maxSize-1)throw0;
data[++top_p]=d;
intseqStack:
pop(){
//如果栈为空,抛出异常值0if(top_p==-1){
throw0;
returndata[top_p--];
top(){
//如果栈为空,抛出异常值0
if(top_p==-1){
returndata[top_p];
~seqStack(){
delete[]data;
后缀表达式***********************/intseqStack:
trans(charexp[])
{
charpostexp[10];
//注意只有10位charch;
inti=0,j=0;
top_p=-1;
ch=exp[i];
i++;
for(;
ch!
!
'
;
)//输入叹号结束
switch(ch)
case'
//
”情况
top_p++;
data[top_p]=ch;
break;
)'
{//“)”情况
while(data[top_p]!
postexp[j]=data[top_p];
j++;
top_p--;
break;
//“+”情况
-'
//“-”情况
while((top_p!
=-1)&
(data[top_p]!
))//(top_p!
)时出栈
data[top_p]=ch;
//压入栈中
//“*”情况
//“/”情况
时出栈
1)&
)&
(data[top_p]=='
||data[top_p]=='
))
'
default:
while(ch>
0'
ch
postexp[j]=ch;
i--;
postexp[j]='
#'
//数字区分符
}ch=exp[i];
}//结束循环
while(top_p!
=-1)//将运算符全部出栈{
//‘0'
结束
*******************************value
函数的实现
**/floatd=0;
****************************
charsh;
intk=0;
sh=postexp[k];
k++;
while(sh!
\0'
switch(sh)
data[top_p-1]=data[top_p-1]+data[top_p];
top_p--;
data[top_p-1]=data[top_p-1]-data[top_p];
data[top_p-1]=data[top_p-1]*dat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 四则运算 c+ 实现