Pagini recente » Cod sursa (job #2480300) | Cod sursa (job #1497734) | Cod sursa (job #3143033) | Cod sursa (job #3030462) | Cod sursa (job #715361)
Cod sursa(job #715361)
#include <fstream>
#include <stack>
using namespace std;
char sir[100005];
char post[200005];
long citestenumar(char *&s)
{
long res = 0;
long t;
while (((unsigned)(t = (*s - '0'))) < 10)
{
res *= 10;
res += t;
s += 1;
}
return res;
}
void copiazanumar(char *&dest,char *&src)
{
long t;
while (((unsigned long)(t = (*src - '0'))) < 10)
{
*dest = *src;
src += 1;
dest += 1;
}
}
long pri(char op)
{
if (op == '+')
{
return 1;
}
if (op == '-')
{
return 1;
}
if (op == '*')
{
return 2;
}
if (op == '/')
{
return 2;
}
return 0;
}
void pfx(void)
{
stack<char> S;
char *p = sir;
char *f = post;
while (*p != 0)
{
if ((pri(*p) == 0) && (*p != '(') && (*p != ')'))
{
copiazanumar(f,p);
*f = ' ';
f += 1;
}
else
{
if ((*p != '(') && (*p != ')'))
{
while ((S.empty() == 0) && (pri(S.top()) >= pri(*p)))
{
*f = S.top();
f += 1;
S.pop();
}
S.push(*p);
p += 1;
}
if (*p == '(')
{
S.push('(');
p += 1;
}
if (*p == ')')
{
while (S.top() != '(')
{
*f = S.top();
f += 1;
S.pop();
}
S.pop();
p += 1;
}
}
}
while (S.empty() == 0)
{
*f = S.top();
S.pop();
f += 1;
}
}
long eval(void)
{
stack<long> S;
char *p = post;
while (*p != 0)
{
if (('0' <= (*p)) && ((*p) <= '9'))
{
S.push(citestenumar(p));
}
else
{
if (*p == ' ')
{
p += 1;
continue;
}
long V1,V2,V3;
V2 = S.top(); S.pop();
V1 = S.top(); S.pop();
switch (*p)
{
case '+' :
{
V3 = V1 + V2;
}
break;
case '-' :
{
V3 = V1 - V2;
}
break;
case '*' :
{
V3 = V1 * V2;
}
break;
case '/' :
{
V3 = V1 / V2;
}
break;
};
S.push(V3);
p += 1;
}
}
long res = S.top();
S.pop();
return res;
}
int main(void)
{
fstream fin("evaluare.in",ios::in);
fstream fout("evaluare.out",ios::out);
fin >> sir;
pfx();
fout << eval();
fin.close();
fout.close();
return 0;
}