Cod sursa(job #1513519)

Utilizator BaweeLazar Vlad Bawee Data 29 octombrie 2015 17:43:02
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <fstream>
#include <iostream>
#include <cstring>
#define MAX 1000000005

using namespace std;

ifstream f("evaluare.in");
ofstream g("evaluare.out");

char a[100001];

struct abc
{
    int pr;
    int num;
    char c;
} v[100001];

struct Nod {
    int num;
    char c;
    Nod *ls;
    Nod *ld;
};

typedef Nod *PNod;

int poz;

int cauta(int a,int b){
    int minn = MAX,minni;
    for(int i = a; i <= b; i++)
        if(v[i].pr <= minn){
            minn = v[i].pr;
            minni = i;
        }
    return minni;
}

inline void magic(PNod &p)
{
    p -> num = 0;
    p -> c = 0;
}

void mache(int a, int b, PNod &p)
{
      	int poz = cauta(a,b);
        p = new Nod;
        magic(p);
        if(a != b) p -> c = v[poz].c;
        else p -> num = v[poz].num, p -> ls = NULL, p -> ld = NULL;

    	if(a<=poz-1)   mache(a,poz - 1,p -> ls);
    	if(poz+1<=b)   mache(poz + 1,b,p -> ld);

}

int eval(PNod p)
{   if(p -> c == '+') return eval(p -> ls) + eval(p -> ld);
    else  if(p -> c == '-') return eval(p -> ls) - eval(p -> ld);
        else if(p -> c == '*') return eval(p -> ls) * eval(p -> ld);
        else if(p -> c == '/') return eval(p -> ls) / eval(p -> ld);
        else return p -> num;

}

int main()
{
    int num,vf = 0;

    f >> a;
    int l = strlen(a);

    int p = 0;// fac vectorul de prioritati
    for(int i = 0; i < l; i++)
    {
        if(a[i] == '(') p += 10;
        else if(a[i] == ')') p -= 10;
        else
        {
            if(a[i] == '*' or a[i] == '/')
                v[++vf].pr = 10 + p, v[vf].c = a[i];
            else if(a[i] == '+' or a[i] == '-')
                v[++vf].pr = 1 + p, v[vf].c = a[i];

            else
            {
                num = 0;
                while(a[i] >= '0') num = num * 10 + a[i] - '0',i++;
                i--;
                v[++vf].pr = MAX;
                v[vf].num = num;
            }
        }
    }

    PNod r = 0;

    mache(1,vf,r);

   g << eval(r);//???????????????????????????

    return 0;
}