Cod sursa(job #2790686)

Utilizator DajaMihaiDaja Mihai DajaMihai Data 29 octombrie 2021 12:46:17
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <stdio.h>
#include <string.h>
#define MAXX 100000

using namespace std;

char v[MAXX];
int cnt, n, sign = 1, sum;

char op [MAXX];
int cntOp;

int f [MAXX], cntF;


int hasPriority (char c){
    if (c == '*' || c == '/')
        return 2;
    if (c == '+' || c == '-')
        return 1;
    return 0;
}


void pushOp(char c) {
    op [cntOp ++] = c;
}
int PopOp (){
    cntOp --;
    return op[cntOp];
}


void PushFact (int fact){
    f [cntF] = fact;
    cntF ++;
}
int PopFact (){
    cntF --;
    return f [cntF];
}


int calculate(int x, int y, char c){
    if (c == '*')
        return x * y;
    else if (c == '/')
        return x / y;
    else if (c == '+')
        return x + y;
    else if (c == '-')
        return x - y;
}


void calcLast (){
    int x = PopFact ();
    int y = PopFact ();
    PushFact(calculate (y, x, op[cntOp - 1]));
    cntOp --;
}

int getNumber(){
    int number = 0;
    while (v[cnt] >= '0' && v[cnt] <= '9'){
        number = number * 10 + v [cnt] - '0';
        cnt ++;
    }
    return number;
}


int main()
{
    FILE *fin, *fout;
    fin = fopen ("evaluare.in", "r");
    fout = fopen ("evaluare.out", "w");

    fgets (v, MAXX, fin);
    n = strlen (v);
    while (cnt < n){
        if (v [cnt] >= '0' && v [cnt] <= '9')
            PushFact (getNumber());
        else if (v[cnt] == '('){
            pushOp (v[cnt]);
            cnt ++;
        }
        else if (v[cnt] == ')'){
            while (op[cntOp - 1] != '('){
                    calcLast ();
                   }
                cntOp --;
                cnt ++;
        }
        else if (hasPriority (v [cnt])){
                while (hasPriority(op[cntOp - 1]) && hasPriority(op[cntOp - 1]) >= hasPriority(v[cnt]))
                    calcLast ();
                pushOp (v[cnt ++]);
        }
        else
            cnt ++;
    }
    while (cntOp){
        calcLast ();
    }
    fprintf (fout, "%d", PopFact());
    return 0;
}
// push, pop, calculate
//plang