Pagini recente » Cod sursa (job #3267440) | Cod sursa (job #2262291) | Cod sursa (job #83294) | Cod sursa (job #2306871) | Cod sursa (job #2255936)
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int nrList[50002];
char opList[50002];
pair<int, int> incParant[25002],k[25002];
int back1, back2, back3, back4;
char opRank[257] = {0};
int efectuareOperatie(int a, int b, char o)
{
switch(o){
case '+': a = a + b; break;
case '-': a = a - b; break;
case '*': a = a * b; break;
case '/': a = a / b; break;
}
return a;
}
void rezSir_deOperatii(int k1, int k2)
{
int rez = nrList[k1],
i = k1 + 1, j = k2;
while(i <= back1 && j <= back2)
rez = efectuareOperatie(rez, nrList[i++], opList[j++]);
back1 = k1 - 1; back2 = k2 - 1;
nrList[++back1] = rez;
}
void tratareParanteza(char o)
{
if(o == '('){
opList[++back2] = '(';
incParant[++back3] = make_pair(back1 + 1, back2);
}
else
{
if(back4 > 0 && k[back4].second > incParant[back3].second)
{
rezSir_deOperatii(k[back4].first, k[back4].second);
back4--;
}
rezSir_deOperatii(incParant[back3].first, incParant[back3].second + 1);
back3--;back2--;
}
}
void tratareOperator(char o)
{
if(o == '(' || o == ')') tratareParanteza(o);
else
{
if(opRank[o] < opRank[opList[back2]])
{
rezSir_deOperatii(k[back4].first, k[back4].second);
back4--;opList[++back2] = o;
}
else
{
if((back2 == 0 && opRank[o] == 2) || (opRank[o] == 2 && opRank[opList[back2]] <= 1))
k[++back4] = make_pair(back1, back2 + 1);
opList[++back2] = o;
}
}
}
int main()
{
char exprInfix[100002], o;
int i, f, n, rez, j;
opRank['+'] = opRank['-'] = 1;
opRank['*'] = opRank['/'] = 2;
fin.getline(exprInfix, 100001);
i = 0; n = strlen(exprInfix);
while(i < n)
{
if(isdigit(exprInfix[i]))
{
f = atoi(exprInfix + i);
nrList[++back1] = f;
while(isdigit(exprInfix[i]) && i < n) i++;
}
else
{
o = exprInfix[i];
tratareOperator(o);
i++;
}
}
if(back4 > 0)
{
rezSir_deOperatii(k[back4].first, k[back4].second);
back4--;
}
rezSir_deOperatii(1, 1);
fout << nrList[1];
return 0;
}