hdoj 1237 简单计算器《栈》
原创
©著作权归作者所有:来自51CTO博客作者leibniz_zhang的原创作品,请联系作者获取转载授权,否则将追究法律责任
简单计算器
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17641 Accepted Submission(s): 6181
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36
Source
浙大计算机研究生复试上机考试-2006年
Recommend
JGShining | We have carefully selected several similar problems for you:
1230
1235
1229
1231
1228
结束时是ch="0" -.-
代码:
#include<cstdio>
#include<stack>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char ch[1010];
int chang,i,a,b;
char lp;
double sh()
{
int kkp=0;
for (;ch[i]<='9'&&ch[i]>='0';i++)
kkp=kkp*10+ch[i]-'0';
i--;
return kkp;
}
double suan()
{
double a,b;
stack<char> fu;
stack<double> shu;
stack<char> hfu;
stack<double> hshu;
chang=strlen(ch);
for (i=0;i<chang;i++)
{
// printf("%d ==%c== 66\n",i,ch[i]);
if (ch[i]==' ')
continue;
if (ch[i]>='0'&&ch[i]<='9')
shu.push(sh());
else if (fu.empty())
fu.push(ch[i]);
else
{
lp=fu.top();
fu.pop();
if (lp=='*'||lp=='/')
{
a=shu.top();
shu.pop();
b=shu.top();
shu.pop();
if (lp=='*')
b*=a;
else
b/=a;
shu.push(b);
}
else
{
fu.push(lp);
}
fu.push(ch[i]);
}
}
if (!fu.empty())
{
lp=fu.top();
fu.pop();
if (lp=='*'||lp=='/')
{
a=shu.top();
shu.pop();
b=shu.top();
shu.pop();
if (lp=='*')
b*=a;
else
b/=a;
shu.push(b);
}
else
{
fu.push(lp);
}
}
while (!fu.empty())
{
lp=fu.top();
fu.pop();
hfu.push(lp);
}
while (!shu.empty())
{
a=shu.top();
shu.pop();
hshu.push(a);
}
while (!hfu.empty())
{
lp=hfu.top();
hfu.pop();
a=hshu.top();
hshu.pop();
b=hshu.top();
hshu.pop();
if (lp=='+')
a+=b;
else
a-=b;
hshu.push(a);
}
a=hshu.top();
return a;
}
int main()
{
while (gets(ch))
{
if (ch[0]=='0'&&strlen(ch)==1)
break;
double s=suan();
printf("%.2lf\n",s);
}
return 0;
}
简洁数组过:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
double a,shu[200];char hao[5];
while (~scanf("%lf",&shu[0]))
{
int kp=1,op=0;
while (getchar()!='\n')
{
op=1;
scanf("%s%lf",hao,&a);
if (hao[0]=='+')
shu[kp++]=a;
else if (hao[0]=='-')
shu[kp++]=-a;
else if (hao[0]=='/')
shu[kp-1]/=a;
else if (hao[0]=='*')
shu[kp-1]*=a;
}
if (!op) break;
double s=0;
for (int i=0;i<kp;i++)
s+=shu[i];
printf("%.2lf\n",s);
}
return 0;
}