Cod sursa(job #1990290)

Utilizator FretenruaelIon Andrei Fretenruael Data 11 iunie 2017 12:07:43
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>

using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char sto[100001],S[100001];
int pr[257],i,k1,k2,nr,stn[100001];

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

int main()
{
    pr['(']=0;
    pr['+']=pr['-']=1;
    pr['*']=pr['/']=2;
    fin>>S;
    for(i=0;S[i]!=0;i++){
        if(S[i]=='(')
            sto[++k1]=S[i];

        else if(S[i]>='0'&&S[i]<='9'){
            nr=0;
            while(S[i]>='0'&&S[i]<='9'){
                nr=nr*10+(S[i]-'0');
                i++;
                }
           i--;
            stn[++k2]=nr;
        }
        else
            if(S[i]==')'){
             while(sto[k1]!='('){
                    int k=calcul(sto[k1],stn[k2-1],stn[k2]);
                    k1--;
                    k2--;
                    stn[k2]=k;
                  }
            k1--;}
            else{
                while(k1>0&&pr[S[i]]<=pr[sto[k1]]){
                    int k=calcul(sto[k1],stn[k2-1],stn[k2]);
                    k1--;
                    k2--;
                    stn[k2]=k;
                }
                sto[++k1]=S[i];
            }
    }
    while(k1>0){
        int k=calcul(sto[k1],stn[k2-1],stn[k2]);
                    k1--;
                    k2--;
                     stn[k2]=k;
    }
    fout<<stn[k2];
}