简单计算器
这道题初看感觉好简单,题意也很好理解,但是等到我真的去看的时候,就觉得还是有难度的,最开始想用数组做,一个个录入然后直接运算,但是这里还有乘除法,所以我们不能直接运算,但是我们可以用两个数组,一个录入,一个计算,只是多次循环不知道会不会超时,所以我最后还是借鉴了大神的栈的方法。这里面是边算边存数,使用两个栈,一个存数一个存符号,然后通过if这个选择计算,详情可以见代码
#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
int main()
{
int i;
double a,b;
char s[250],c;
while(gets(s),strcmp(s,"0")!=0)
{
stack<char>s1;
stack<double>s2;
for(i=0;s[i];i++)
{
if(s[i]>='0'&&s[i]<='9')
{
a=0;
while(s[i]>='0'&&s[i]<='9')
{
a=a*10+s[i]-'0';
i++;
}
i--;
s2.push(a);
}
else if(s[i]=='-'||s[i]=='+')
{
if(!s1.empty())
{
c=s1.top();
s1.pop();
a=s2.top();
s2.pop();
b=s2.top();
s2.pop();
if(c=='+')
a+=b;
else
a=b-a;
s2.push(a);
s1.push(s[i]);
}
else
s1.push(s[i]);
}
else if(s[i]=='/')//这里就是先计算,再存数,首先找到后面的数的值,然后通过top函数引出前面一个数,然后计算,这个时候pop掉栈顶,push这个新算完的数字,存进去,这个时候就算是存完了
{
b=0;
i+=2;
while(s[i]>='0'&&s[i]<='9')
{
b=b*10+s[i]-'0';
i++;
}
i--;
a=s2.top();
s2.pop();
a=a/b;
s2.push(a);
}
else if(s[i]=='*')
{
b=0;
i+=2;
while(s[i]>='0'&&s[i]<='9')
{
b=b*10+s[i]-'0';
i++;
}
i--;
a=s2.top();
s2.pop();
a=a*b;
s2.push(a);
}
}
while(!s1.empty())
{
c=s1.top();
s1.pop();
a=s2.top();
s2.pop();
b=s2.top();
s2.pop();
if(c=='+')
a+=b;
else
a=b-a;
s2.push(a);
}
printf("%.2f\n",s2.top());
}
return 0;
}
浙公网安备 33010602011771号