Pagini recente » Cod sursa (job #242632) | Cod sursa (job #1276435) | Cod sursa (job #1101925) | Cod sursa (job #784949) | Cod sursa (job #633419)
Cod sursa(job #633419)
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define PB push_back
char expresie[100005];
int numar (int start, int stop)
{
int ans = 0;
for (int i = start; i <= stop; ++i) ans = (ans * 10 + (expresie[i] - '0'));
return ans;
}
int baza(int start, int stop)
{
for (int i = start; i <= stop; ++i) if (!isdigit(expresie[i])) return 0;
return 1;
}
int proc (int a, int b, char semn)
{
if (semn == '+') return a + b;
if (semn == '-') return a - b;
if (semn == '*') return a * b;
if (semn == '/') return a / b;
return 0;
}
int evalueaza (int start, int stop)
{
vector <int> pm;
vector <int> md;
if (baza(start, stop)) return numar(start, stop);
int par = 0;
for (int i = start; i <= stop; ++i)
{
if (expresie[i] == '(') ++par;
else if (expresie[i] == ')') --par;
if (par == 0 && (expresie[i] == '+' || expresie[i] == '-')) pm.PB(i);
if (par == 0 && (expresie[i] == '*' || expresie[i] == '/')) md.PB(i);
}
int ans;
if (pm.size() != 0)
{
pm.PB(stop + 1);
ans = evalueaza(start, pm[0]-1);
for (int i = 0; i < pm.size() - 1; ++i)
{
int termen = evalueaza(pm[i]+1, pm[i+1]-1);
ans = proc(ans, termen, expresie[pm[i]]);
}
return ans;
}
else
if (md.size() != 0)
{
md.PB(stop + 1);
ans = evalueaza(start, md[0]-1);
for (int i = 0; i < md.size() - 1; ++i)
{
int termen = evalueaza(md[i]+1, md[i+1]-1);
ans = proc(ans, termen, expresie[md[i]]);
}
return ans;
}
else return evalueaza(start + 1, stop - 1);
}
int main()
{
freopen ("evaluare.in", "r", stdin);
freopen ("evaluare.out", "w", stdout);
scanf ("%s", expresie);
printf ("%d\n", evalueaza(0, strlen(expresie)-1));
return 0;
}