#include<iostream>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<cstdio>
using namespace std;
struct node
{
bool opORnum;
double num;
char opre;
};
string str;
queue<node>q;
stack<node>s;
map<char, int>op;
void change()
{
node temp;
int i = 0;
while (i < str.length())
{
if (str[i] >= '0'&&str[i] <= '9')
{
temp.opORnum = 1;
temp.num = str[i] - '0';
i++;
while (str[i] >= '0'&&str[i] <= '9'&&i < str.length())
{
temp.num = temp.num * 10 + str[i] - '0';
i++;
}
q.push(temp);
}
else
{
temp.opORnum = 0;
temp.opre = str[i];
while (!s.empty() && op[str[i]] <= op[s.top().opre])
{
q.push(s.top());
s.pop();
}
s.push(temp);
i++;
}
/*else if (op[str[i]] == '(')
{
while (op[str[i]] != ')')
{
temp.opre = ch;
temp.opORnum = 0;
q.push(temp);
}
temp.opre = str[i];
temp.opORnum = 0;
s.push(temp);
i++;
}
else if(op[str[i]]>op[ch])
{
q.push(str[i]);
i++;
}
else
{
while (op[str[i]] <= op[ch])
{
temp.opre = ch;
temp.opORnum = 0;
q.push(temp);
}
temp.opre = str[i];
temp.opORnum = 0;
s.push(temp);
i++;
}*/
}
while (!s.empty())
{
q.push(s.top());
s.pop();
}
}
double getvalue()
{
node temp, temp1, temp2, back;
while (!q.empty())
{
temp = q.front();
q.pop();
if (temp.opORnum == 1)
{
s.push(temp);
}
else
{
temp2 = s.top();
s.pop();
temp1 = s.top();
s.pop();
back.opORnum = 1;
if (temp.opre == '-')
{
back.num = temp1.num - temp2.num;
}
else if (temp.opre == '+')
{
back.num = temp1.num + temp2.num;
}
else if (temp.opre == '*')
{
back.num = temp1.num * temp2.num;
}
else
{
back.num = temp1.num / temp2.num;
}
s.push(back);
}
}
return s.top().num;
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(0);
op['-'] = op['+'] = 1;
op['/'] = op['*'] = 2;
while (getline(cin, str), str != "0")
{
for (string::iterator it = str.end(); it != str.begin(); it--)
{
if (*it == ' ')
{
str.erase(it);
}
}
while (!s.empty())
{
s.pop();
}
change();
printf("%.2f\n", getvalue());
}
return 0;
}
计算器 中缀表达式
最新推荐文章于 2022-12-14 17:23:56 发布