Cod sursa(job #2274562)

Utilizator andra1782Andra Alazaroaie andra1782 Data 2 noiembrie 2018 02:40:32
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <stdio.h>
#define MAX 100000
FILE *fin,*fout;
char ch,p[2*MAX],st[MAX];
int i,j,a,k,nr[MAX/2];

int numar(){
    int nr=0;
    while('0'<=p[a] && p[a]<='9')
        nr=nr*10+p[a++]-'0';
    return nr;
}

int prioritate(int semn){
    if(semn=='(')
        return 2;
    if(semn=='+' || semn=='-')
        return 1;
    return 0;
}

int eval(){
    a=0;
    while(a<i){
        if('0'<=p[a] && p[a]<='9')
            nr[k++]=numar();
        else if(p[a]==' ')
            a++;
        else{
            switch(p[a]){
                case '+': nr[k-2]+=nr[k-1]; break;
                case '-': nr[k-2]-=nr[k-1]; break;
                case '*': nr[k-2]*=nr[k-1]; break;
                case '/': nr[k-2]/=nr[k-1]; break;
            }
            k--;
            a++;
        }
    }
    return nr[0];
}

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

    ch=fgetc(fin);
    while(ch!='\n'){
        if('0'<=ch && ch<='9'){
            p[i++]=ch;
        }else{
            p[i++]=' ';
            if(ch=='('){
                st[j++]=ch;
            }else if(ch==')'){
                while(j>0 && st[j-1]!='(')
                    p[i++]=st[--j];
                j--;
            }else{
                while(j>0 && prioritate(st[j-1])<=prioritate(ch))
                    p[i++]=st[--j];
                st[j++]=ch;
            }
        }
        ch=fgetc(fin);
    }
    while(j>0)
        p[i++]=st[--j];
    fprintf(fout,"%d\n",eval());
    fclose(fin);
    fclose(fout);
    return 0;
}