Pagini recente » Cod sursa (job #2380012) | Cod sursa (job #2758525) | Cod sursa (job #2032507) | Cod sursa (job #68211) | Cod sursa (job #2698970)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
struct p
{
char semn;
int ordine;
};
array <p , 100005> f;
int ff[100005];
int nr_f;
char a[100005];
char fp[100005];
int nr_fp;
int n , k = 2;
int nr[100005] , nr_nr;
int find_nr(int &poz);
void creare_fp_nr();
int find_val();
int rez(int p1 , char oper , int p2);
int main()
{
fin.getline(a , 100005);
n = strlen(a);
creare_fp_nr();
fout << find_val();
return 0;
}
int find_nr(int &poz)
{
int nr = 0;
while (a[poz] >= '0' && a[poz] <= '9')
{
nr = nr * 10 + a[poz] - 48;
//a[poz] = ' ';
poz++;
}
//a[poz-1] = 'a';
return nr;
}
void creare_fp_nr()
{
f[0].ordine = 0;
int ordin;
for (int i=0;i<n;i++)
{
if (a[i] == '(')
{
k += 2;
}
else if (a[i] == ')')
{
k -= 2;
}
else if (a[i] >= '0' && a[i] <= '9')
{
nr[nr_nr] = find_nr(i);
i--;
fp[nr_fp] = 'a';
nr_nr++;
nr_fp++;
}
else
{
if (a[i] == '-' || a[i] == '+')
{
ordin = k - 1;
}
if (a[i] == '*' || a[i] == '/')
{
ordin = k;
}
if (f[nr_f].ordine == 0 && nr_f == 0)
{
f[nr_f].ordine = ordin;
f[nr_f].semn = a[i];
}
else
{
if (ordin < f[nr_f].ordine)
{
while (ordin < f[nr_f].ordine && nr_f >= 0)
{
fp[nr_fp] = f[nr_f].semn;
nr_fp++;
nr_f--;
}
}
nr_f++;
f[nr_f].ordine = ordin;
f[nr_f].semn = a[i];
}
}
}
for (int i=nr_f;i>=0;i--)
{
fp[nr_fp] = f[i].semn;
nr_fp++;
}
}
int find_val()
{
int poz_nr = 0 , poz_ff = 0;
for (int i=0;i<=nr_fp;i++)
{
if (fp[i] == 'a')
{
ff[poz_ff] = nr[poz_nr];
poz_nr++;
poz_ff++;
}
else
{
poz_ff -= 2;
ff[poz_ff] = rez(ff[poz_ff] , fp[i] , ff[poz_ff+1]);
poz_ff++;
}
}
return ff[0];
}
int rez(int p1 , char oper , int p2)
{
if (oper == '-')
return p1 - p2;
if (oper == '+')
return p1 + p2;
if (oper == '/')
return p1 / p2;
if (oper == '*')
return p1 * p2;
}