Pagini recente » Cod sursa (job #1332651) | Cod sursa (job #2027961) | Cod sursa (job #2721067) | Cod sursa (job #481780) | Cod sursa (job #1881300)
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <fstream>
#include <stack>
#include <cstring>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
void polak(char*s);
void eval(char*s);
void adauga(char c);
char* sir(char c);
char e[200005], pl[200005], aux[3];
stack<char> S;
stack<int> SS;
int main()
{
fin.getline(e, 100005);
polak(e);
eval(pl);
return 0;
}
void polak(char*s)
{
int i, lg;
lg = strlen(s);
for (i = 0; i < lg; i++)
if ('0' <= s[i] && s[i] <= '9')
strcat(pl, sir(s[i]));
else
{
strcat(pl, sir(' '));
adauga(s[i]);
}
while (!S.empty())
{
strcat(pl, sir(S.top()));
S.pop();
}
//fout << pl << '\n';
}
void eval(char*s)
{
int i, lg, nr = 0, a, b;
lg = strlen(s);
i = 0;
while (i < lg)
{
if (('0' <= s[i] && s[i] <= '9'))
{
while ('0' <= s[i] && s[i] <= '9')
{
nr = nr * 10 + s[i] - '0';
i++;
}
SS.push(nr);
nr = 0;
}
if (s[i] == ' ')
i++;
else
{
b = SS.top();
SS.pop();
a = SS.top();
SS.pop();
switch (s[i])
{
case '+': a += b; break;
case '-': a -= b; break;
case '*': a *= b; break;
case '/': a /= b; break;
}
SS.push(a);
i++;
}
}
fout << SS.top() << '\n';
}
void adauga(char c)
{
if (c == '(')
S.push(c);
else if (c == ')')
{
while (S.top() != '(')
{
strcat(pl,sir(S.top()));
S.pop();
}
S.pop();
}
else if (c == '/' || c == '*')
{
while (!S.empty() && (S.top() == '*' || S.top() == '/'))
{
strcat(pl, sir(S.top()));
S.pop();
}
S.push(c);
}
else
{
while (!S.empty() && S.top()!='(')
{
strcat(pl, sir(S.top()));
S.pop();
}
S.push(c);
}
}
char* sir(char c)
{
aux[0] = c;
aux[1] = 0;
return aux;
}