Cod sursa(job #2840383)

Utilizator un_fes_galbendaniel guba un_fes_galben Data 27 ianuarie 2022 17:34:13
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int stiva_op[100005],stiva_rez[100005],nr;string s;int poz1=0,poz2=0,poz=0;
int rez,rez1;int semn;
void F(int start){
   while(1){
       if(s[poz]=='+'){
        poz1++;stiva_op[poz1]=1;poz++;
       }
       else if(s[poz]=='-'){
        poz1++;stiva_op[poz1]=2;poz++;
       }
       else if(s[poz]=='*'){
        poz1++;stiva_op[poz1]=3;poz++;
       }
       else if(s[poz]=='/'){
        poz1++;stiva_op[poz1]=4;poz++;
       }
       else if(s[poz]>='0'&&s[poz]<='9'){nr=0;
        while(s[poz]>='0'&&s[poz]<='9'){
            nr=nr*10+(s[poz]-'0');poz++;
        }
        poz2++;stiva_rez[poz2]=nr;
       }
       else if(s[poz]=='('){
           poz++;F(poz2+1);
       }
       else if(s[poz]==')'||poz>=s.size()){
        rez1=stiva_rez[start];rez=0;semn=1;
        for(int i=start+1;i<=poz2;i++){
            if(stiva_op[i-1]==1||stiva_op[i-1]==2){
                rez+=semn*rez1;rez1=stiva_rez[i];if(stiva_op[i-1]==1){semn=1;}else{semn=-1;}
            }
            else if(stiva_op[i-1]==3){
                rez1*=stiva_rez[i];
            }
            else if(stiva_op[i-1]==4){
                rez1/=stiva_rez[i];
            }
        }
        if(rez1!=0){
            rez+=semn*rez1;
        }
        stiva_rez[start]=rez;poz2=start;poz1=start-1;poz++;return;
       }
   }
}
int main()
{
   fin>>s;s="0+("+s;s=s+")";F(0);
   fout<<stiva_rez[0]<<'\n';
    return 0;
}