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;
}