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
思路:
先将字符串的数字和符号分别存入两个队列中间,然后依次出队。
代码:
#include<iostream>
#include<sstream>
#include<string>
#include<queue>
#include<iomanip>
#include<stdlib.h>
using namespace std;
int flag;
char i;
double j,k;
string a,w;
queue<char>s;
queue<double>n;
bool is_num(string s)//判断字符串是数字还是符号
{
stringstream sin(s);
char a;
double b;
if(!(sin>>b))
return false;
else
return true;
}
char work(char a,char b)//判断先进行什么计算
{
if(a=='+'||a=='-')
{
if(b=='+'||b=='-')
return '=';
else
return '<';
}
else
{
if(b=='*'||b=='/')
return '=';
else
return '>';
}
}
double op(char i,double j,double k)//计算
{
if(i=='+')
return j+k;
else if(i=='-')
return j-k;
else if(i=='*')
return j*k;
else
return j/k;
}
int main()
{
while(getline(cin,a)&&a!="0")
{
flag=0;
stringstream ss(a);
while(ss>>w)
{
if(is_num(w))
n.push(atof(w.c_str()));
else
{
i=w[0];
s.push(i);
}
}
s.push('+');
s.push('+');
n.push(0);
n.push(0);
j=n.front();
n.pop();
while(s.size()>1)
{
if(!flag)
{
i=s.front();
s.pop();
k=n.front();
n.pop();
}
switch(work(i,s.front()))
{
case '=':
flag=0;
j=op(i,j,k);
break;
case '>':
flag=0;
j=op(i,j,k);
break;
case '<':
flag=1;
k=op(s.front(),k,n.front());
s.pop();
n.pop();
break;
}
}
cout<<setiosflags(ios::fixed)<<setprecision(2)<<j<<endl;//保留小数点后面两位
}
return 0;
}