用两种方式实现表达式自动计算教学文稿Word格式.docx
- 文档编号:16841646
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:16
- 大小:268.05KB
用两种方式实现表达式自动计算教学文稿Word格式.docx
《用两种方式实现表达式自动计算教学文稿Word格式.docx》由会员分享,可在线阅读,更多相关《用两种方式实现表达式自动计算教学文稿Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
⑼重复过程,直到度完。
栈顶元素就是最终结果。
⑽结束。
2.中缀直接计算:
⑴如果获取的操作符a的优先级高于操作符栈栈顶元素b的优先级,则a直接入操作符栈;
⑵如果获取的操作符a的优先级低于操作符栈栈顶元素b的优先级,则b出栈,a进栈,并且取出操作数栈的栈顶元素m,再取出操作数栈新的栈顶元素n,如果b为+,则用n+m,若为减号,则n-m,依此类推,并将所得结果入操作数栈;
⑶如果获取的是“(”,则直接进操作符栈;
⑸如果获取的是“)”,则操作符栈的栈顶元素出栈,做类似于情况2的计算,之后把计算结果入操作数栈,再取操作符栈顶元素,如果不是“(”,则出栈,重复操作,直到操作符栈顶元素为“(”,然后“(”出栈;
⑹当表达式中的所有元素都入栈后,看操作符栈中是否还有元素,如果有,则做类似于情况2的计算,并将结果存入操作数栈,则操作数栈中最终的栈顶元素就是所要求的结果。
二、算法流程图
1.后缀
2.中缀直接计算
开始
从后缀数组中获取元素
是否为数
存入操作数栈中
为操作符,则从操作数栈中取值作相应操作
后缀数组中是否还有元素
栈里最终栈顶元素即为最终结果
结束
三、源代码
1.后缀表达式
#include<
stdio.h>
#include<
string.h>
stdlib.h>
string>
stack>
algorithm>
#include"
fstream.h"
#defineMAXN1000
usingnamespacestd;
stack<
char>
S1;
//定义栈S1,转换专用
double>
S2;
//定义栈S2,计算专用
char*tranfExp(char*exp)//变换后缀
{
chartempStr[1000];
//保存后缀表达式的字符串
charch;
inti=0,j=0;
inta=0;
//标记表达式是否正确专用
///intb=0;
//标记数字格式是否正确待用
while(exp[i]!
='
\0'
)
{
if((exp[i]>
0'
&
&
exp[i]<
9'
)||exp[i]=='
.'
)//数字直接进字符串
tempStr[j++]=exp[i];
//tempStr[j]='
'
;
}
elseif(exp[i]=='
('
)//左括号蹦进栈S1
S1.push(exp[i]);
)'
)//如果是右括号,就把左括号后面的运算符都进字符串
while(S1.empty()==false)
{
tempStr[j++]=S1.top();
//括号里进数组
S1.pop();
//进一个,蹦一个
if(S1.top()=='
{
S1.pop();
//蹦出去‘(’
break;
}
}
+'
||exp[i]=='
-'
)//如果遇到了加后者减号
while(S1.empty()==false)
ch=S1.top();
if(ch=='
||ch=='
)//与栈顶比较优先级,同级直接进栈
S1.push(exp[i]);
else//不同级,S1栈里的东西都进字符串里
{
while(S1.empty()==false)
{
tempStr[j++]=S1.top();
S1.pop();
if(S1.top()=='
)//如果有括号就把括号前面的进串,括号后的不进
}
if(S1.empty()==true)//如果S1里的东西都进字符串了,变成空了,就把扫描遇到的东西,蹦进S1
{S1.push(exp[i]);
*'
/'
S1.push(exp[i]);
else
{
printf("
你输入的不对!
!
"
);
a=1;
break;
//异常处理
i++;
while(S1.empty()==false)//最后把S1中的所有运算符弹出栈
{if(a==1)
{break;
else
{tempStr[j++]=S1.top();
}
tempStr[j]='
//最后一个赋值为空字符串结束的标志
if(a==1)
return0;
returntempStr;
//返回得到的后缀表达式
}
doublecalcExp(char*exp)//计算
inti=0;
='
if((exp[i]>
exp[i]<
)//把数进栈S2,遇到运算符,就弹2个数计算,结果再进S2
if(exp[i]=='
)//小数处理专用
doublex=0;
doubley=0;
x=S2.top();
printf("
X的值%f\n"
x);
S2.pop();
i++;
y=exp[i]-'
printf("
y的值%f\n"
y);
x=x+y/10;
S2.push(x);
{S2.push(exp[i]-'
进栈计算的数%f\n"
S2.top());
doublem=S2.top();
S2.pop();
doublen=S2.top();
S2.push(n-m);
)
//printf("
M的值%d\n"
m);
N的值%d\n"
n);
S2.push(n+m);
S2.push(n/m);
S2.push(n*m);
i++;
returnS2.top();
main()
charstr[1000];
charstr1[1000];
char*tranStr;
intlen;
doublerel;
//最后结果
tranStr=(char*)malloc(100*sizeof(char));
输入字符\n"
scanf("
%s"
str);
转换成后缀表达式\n"
tranStr=tranfExp(str);
len=strlen(tranStr);
puts(tranStr);
for(inti=0;
i<
=len;
i++)//直接传tranStr会发生莫名其妙的错误,所以重新定义了个数组,把串全传送过去
{str1[i]=tranStr[i];
rel=calcExp(str1);
结果为%f\n"
rel);
iostream>
inttransform(chars[],charstored[])//转化
constinta[8]={-1,-1,2,1,0,1,0,2};
//保存优先级
inti,j,temp;
stack<
sk;
for(i=0,j=0,temp=0;
s[i]!
i++)//j保存数组stored的有效数字的长度
if(s[i]>
s[i]<
temp=temp*10+s[i]-'
else
if(temp!
=0)
stored[j++]=temp+'
temp=0;
if(!
sk.empty()&
sk.top()=='
)//弹出)
sk.pop();
if(sk.empty())//空就压入
sk.push(s[i]);
if(a[s[i]-'
]==a[sk.top()-'
])//这里看看ASCii表就明白了
stored[j++]=sk.top();
if((a[s[i]-'
]<
a[sk.top()-'
]&
)||s[i]=='
while(!
sk.top()!
)//停止标志
sk.empty())
//最后的数字也要拿
sk.empty())//残余运算符
returnj;
intcalcular(charstored[],intn)
int>
cal;
inti,x,y,result=0;
for(i=0;
n;
i++)
if(stored[i]=='
||stored[i]=='
)//遇到运算符
y=cal.top();
cal.pop();
x=cal.top();
switch(stored[i])//各种运算
case'
:
result=x+y;
break;
result=x-y;
result=x*y;
result=x/y;
cal.push(result);
//保存当前结果
cal.push(stored[i]-'
returnresult;
intmain()
chars[1000];
charstored[1000];
intn,result;
while(cin>
>
s)
n=transform(s,stored);
result=calcular(stored,n);
cout<
<
result<
endl;
return0;
四、运行结果
输入
结果
五、遇到的问题及解决
经过一个星期的写代码,我遇到了很多问题,并一一解决了,比如一些莫名其名的错误,都是思路没问题,但是呢,都是逻辑错误。
还有就是老师提问的,分隔符问题。
不过可以解决,但是呢,要大量的改代码,我怕时间不够了,就不改了,因为还要去弄下一个报告了。
算法不一定是程序,但程序一定是算法!
六、心得体会
在做完本项目之后,体会最深的就是应该细心,并且很多时候我们看见某些事情很简单就不想去做,而做的时候又总会遗漏很多需要考虑的细节,或者根本就不知道从哪入手更好,在做这个项目时,错过很多次,很多时候有一种成功离自己很近很近,似乎可以看到,但就是无法接触到的感觉,我想,在以后的学习中,应该把一些必要的程序都敲一遍,而不要直接说句,简单,然后不屑去做,这样,其实最终很难真正学到什么!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 用两种 方式 实现 表达式 自动 计算 教学 文稿