Pagini recente » Cod sursa (job #1251667) | Cod sursa (job #1482154) | Cod sursa (job #345171) | Cod sursa (job #916101) | Cod sursa (job #2560521)
#include <fstream>
#include <cstring>
#include <stack>
using namespace std;
ifstream f ("evaluare.in");
ofstream g ("evaluare.out");
char s[100005];
int aux[100005];
stack < int > stiva;
int solve (int st, int dr)
{
char semn = '+';
int numar, i, j, rez = 0;
for (i=st; i<=dr; i++)
{
if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
semn = s[i];
if (s[i] >= '0' && s[i] <= '9')
{
j = i, numar = 0;
while (s[j] >= '0' && s[j] <= '9')
{
numar = numar * 10 + s[j] - '0';
j ++;
}
i = j-1;
if (semn == '*')
{
if (rez == 0)
rez = 1;
rez *= numar;
}
if (semn == '+')
rez += numar;
if (semn == '-')
rez -= numar;
if (semn == '/')
rez /= numar;
}
if (s[i] == '(')
{
if (semn == '+')
rez += solve(i+1, aux[i]-1);
if (semn == '/')
rez /= solve(i+1, aux[i]-1);
if (semn == '*')
{
if (rez == 0)
rez = 1;
rez *= solve(i+1, aux[i]-1);
}
if (semn == '-')
rez -= solve(i+1, aux[i]-1);
i = aux[i];
}
}
return rez;
}
void precalc ()
{
int i, x;
for (i=0; s[i]; i++)
{
if (s[i] == '(')
stiva.push(i);
if (s[i] == ')')
{
x = stiva.top();
stiva.pop(), aux[x] = i;
}
}
}
int main()
{
f >> s;
precalc();
g << solve(0, strlen(s)-1);
return 0;
}