HDU——1237简单计算器
分析:模拟题,现将一行的字符读入,当遇见数字就放入数子栈,遇见加减放入字符栈,
遇见乘除,将最顶端的数字串和下一个数字进行计算再放入数字栈 _最后将栈里面的元素倒置,进行加减运算,emmm估计队列也可以用的
用stack和对字符串的处理
给的数据也好,每个数字和字符中间都是用空格分开,好判断emmm~
#include<iostream>
#include<cstdio>
#include<stack>
#include<map>
#include<string>
#include<cstring>
using namespace std;
int main()
{
char s[220];
while(gets(s),strcmp(s,"0"))
/*为0结束 ,gets函数可以无限读取以回车为结束 同时strcmp比较两个字符串
若str1==str2,则返回零; 若str1<str2,则返回负数; 若str1>str2,
则返回正数。*/
{
int len=strlen(s);
stack<char>sym;
stack<double>num;
for(int i=0;i<len;i++)
{
if(s[i]==' ')
continue;
else if(s[i]=='*'||s[i]=='/')
{
double x=num.top();
num.pop();
double y=0;
int j;
for(j=i+2;j<len;j++)//此处注意要跳过几个非数字符号
{
if(s[j]!=' ')
y=y*10+s[j]-'0';
else
break;
}
if(s[i]=='*')
num.push(x*y);
else
num.push(x/y);
i=j;
}//对于乘除直接计算
else if(s[i]=='+'||s[i]=='-')
sym.push(s[i]);
else
{
double ans=0;
int j;
for(j=i;j<len;j++)
{
if(s[j]!=' ')
ans=ans*10+s[j]-'0';
else
break;
}
i=j;
num.push(ans);
}
}
//倒序
stack<char>dsym;
stack<double>dnum;
while(!sym.empty())
{
char e=sym.top();
//cout<<e<<endl;
dsym.push(e);
sym.pop();
}
while(!num.empty())
{
double e=num.top();
//cout<<e<<endl;
dnum.push(e);
num.pop();
}
//进行加减计算
while(!dnum.empty()&&!dsym.empty())
{
double x=dnum.top();
dnum.pop();
double y=dnum.top();
dnum.pop();
char e=dsym.top();
dsym.pop();
if(e=='+')
dnum.push(x+y);
else
dnum.push(x-y);
}
printf("%.2lf\n",dnum.top());
}
return 0;
}