Cod sursa(job #2132822)

Utilizator luanastLuana Strimbeanu luanast Data 16 februarie 2018 08:12:44
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.53 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin ("evaluare.in");
ofstream fout ("evaluare.out");
char expresie[100010];
char stivasemn[100010];
int polish[100010];
int eval[100010];
int i,nr,k,t,a,b,n;
char semn;
int main(){
    fin>>expresie+1;
    n=strlen(expresie+1);
    expresie[0]='(';
    expresie[n+1]=')';
    for(i=0;i<=n+1;i++){
        if(expresie[i]=='(')
            stivasemn[++k]=expresie[i];
        if(expresie[i]>='0' && expresie[i]<='9'){
            nr=0;
            while(expresie[i]>='0' && expresie[i]<='9'){
                nr=nr*10+expresie[i]-'0';
                ++i;
            }
            --i;
            polish[++t]=nr;
        }
        if(expresie[i]=='*' || expresie[i]=='/'){
            while(k>0 && (stivasemn[k]=='*' || stivasemn[k]=='/')){
                if(stivasemn[k]=='*')
                    polish[++t]=-1;
                else
                    polish[++t]=-2;
                --k;
            }
            stivasemn[++k]=expresie[i];
        }
        if(expresie[i]=='+' || expresie[i]=='-'){
            while(stivasemn[k]!='(' && stivasemn[k]!=')'){
                if(stivasemn[k]=='+')
                    polish[++t]=-3;
                if(stivasemn[k]=='-')
                    polish[++t]=-4;
                if(stivasemn[k]=='*')
                    polish[++t]=-1;
                else
                    polish[++t]=-2;
                --k;
            }
            stivasemn[++k]=expresie[i];
        }
        if(expresie[i]==')'){
            while(stivasemn[k]!='('){
                if(stivasemn[k]=='*')
                    polish[++t]=-1;
                if(stivasemn[k]=='/')
                    polish[++t]=-2;
                if(stivasemn[k]=='+')
                    polish[++t]=-3;
                if(stivasemn[k]=='-')
                    polish[k]=-4;
                --k;
            }
            --k;
            continue;
        }
    }
    //corect pana aici!!! modifica evaluarea
    k=0;
    for(i=1;i<=t;i++){
        if(polish[i]>=0)
            eval[++k]=polish[i];
        else{
            b=eval[k];
            --k;
            a=eval[k];
            if(polish[i]==-3){
                eval[k]=a+b;
            }
            if(polish[i]==-4){
                eval[k]=a-b;
            }
            if(polish[i]==-1){
                eval[k]=a*b;
            }
            if(polish[i]==-2)
                eval[k]=a/b;
        }
    }
    fout<<eval[k];
    return 0;
}