Cod sursa(job #2788452)

Utilizator iraresmihaiiordache rares mihai iraresmihai Data 25 octombrie 2021 18:20:55
Problema Evaluarea unei expresii Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.26 kb
///rezolvare cu varianta 1

#include <stdio.h>
#include <string.h>
#define MAXCH 100000

char list_sg[MAXCH];
char s[MAXCH];
int list_nr[MAXCH];
int loc, nr_sg, nr_nr;

void addSign(char ch) {
    if ( ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' ){
        list_sg[nr_sg] = ch;
        nr_sg++;
    }
}

char lastSign() {
    return list_sg[nr_sg - 1];
}

char popSign() {
    nr_sg--;
    return list_sg[nr_sg];
}


int lastNumber() {
    return list_nr[nr_nr - 1];
}
void addNumber(int n) {
    list_nr[nr_nr] = n;
    nr_nr++;
}

int popNumber() {
    nr_nr--;
    return list_nr[nr_nr];
}


int factor() {
    int nr;

    nr = 0;
    while ( s[loc] >= '0' && s[loc] <= '9' ) {
        nr = nr * 10 + s[loc] - '0';
        loc++;
    }

    return nr;
}

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

int operation(int a, int b, char sg) {
    if ( sg == '*' )
        return a * b;
    if ( sg == '/' )
        return a / b;
    if ( sg == '+' )
        return a + b;
    return a - b;
}

void simpleOperation() {
    addNumber(operation(popNumber(), popNumber(), popSign()));
}

int main() {
    FILE *fin, *fout;

    int n;

    fin = fopen("evaluare.in", "r");
    fgets(s, MAXCH, fin);
    n = strlen(s);
    fclose(fin);

    loc = 0;
    nr_sg = 0;
    nr_nr = 0;
    while ( loc < n - 1 ) {
        while ( s[loc] == '(' ) {
            addSign(s[loc]);
            loc++;
        }

        if ( s[loc] >= '0' && s[loc] <= '9' ){
            addNumber(factor());
        } else if ( priority(s[loc]) ) {
            while ( priority(lastSign()) && priority(s[loc]) <= priority(lastSign()) ) {
                simpleOperation();
            }
            addSign(s[loc]);

            loc++;
        } else if ( s[loc] == ')' ) {
            while ( lastSign() != '(' ) {
                simpleOperation();
            }
            popSign();
            loc++;
        }
    }

    while ( nr_sg > 0 ) {
        simpleOperation();
    }

    fout = fopen("evaluare.out", "w");
    fprintf(fout, "%d", popNumber());
    fclose(fout);

    return 0;
}