#include <iostream>
#include <cstdio>
#include <map>
#include <string>
#include <stack>
#include <queue>
using namespace std;
struct node{
double num;
char op;
bool flag;
};
string str;
stack<node>s;
queue<node>q;
map<char,int>op;
void change()
{
node temp;
for(int i = 0;i<str.length();)
{
if(str[i] <= '9' && str[i] >= '0')
{
temp.flag = true;
temp.num = str[i++] - '0';
while(str[i] <= '9' && str[i] >= '0' && i<str.length())
{
temp.num = temp.num * 10 + (str[i] - '0');
i++;
}
q.push(temp);
}
else
{
temp.flag = false;
while(!s.empty() && op[str[i]] <= op[s.top().op])
{
q.push(s.top());
s.pop();
}
temp.op = str[i];
s.push(temp);
i++;
}
}
while(!s.empty())
{
q.push(s.top());
s.pop();
}
}
double cal()
{
node ans,temp;
double num1,num2;
while(!q.empty())
{
temp = q.front();
q.pop();
if(temp.flag == true)
{
s.push(temp);
}
else
{
num2 = s.top().num;
s.pop();
num1 = s.top().num;
s.pop();
ans.flag = true;
if(temp.op == '+')
{
ans.num = num1 + num2;
}
else if(temp.op == '-')
{
ans.num = num1 - num2;
}
else if(temp.op == '*')
{
ans.num = num1 * num2;
}
else if(temp.op == '/')
{
ans.num = num1 / num2;
}
s.push(ans);
}
}
return s.top().num;
}
int main()
{
op['*'] = op['/'] = 2;
op['+'] = op['-'] = 1;
while(getline(cin,str),str != "0")
{
while(!s.empty())
s.pop();
for(string::iterator it = str.end();it!=str.begin();it--)
{
if(*it == ' ')
str.erase(it);
}
change();
// while(!q.empty())
// {
// if(q.front().flag== true)
// cout<<q.front().num<<endl;
// else
// cout<<q.front().op<<endl;
// q.pop();
// }
double ans = cal();
printf("%.2f\n",ans);
}
return 0;
}
codeup 问题 A: 简单计算器(******)
最新推荐文章于 2020-02-23 17:23:37 发布