Cod sursa(job #2480919)

Utilizator Andrei012Trache Andrei Andrei012 Data 26 octombrie 2019 11:12:29
Problema Evaluarea unei expresii Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.8 kb
#include <fstream>
#include <algorithm>
#include <cstring>

using namespace std;

ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
char sir[100001],sirsemne[100001],stsemne[50001];
int sirnumere[50001],stnumere[50001];

int main()
{
    int i,j,k,nr,n;
    cin>>sir;
    n=strlen(sir);
    j=1;
    k=0;
    for(i=0;i<=n-1;i++){
        if(sir[i]<='9' && sir[i]>='0'){
            nr=0;
            while(sir[i]<='9' && sir[i]>='0'){
                nr=nr*10+sir[i]-'0';
                i++;
            }
            i--;
            sirnumere[j]=nr;
            j++;
        }
        else
            if(sir[i]=='('){
                k++;
                stsemne[k]='(';
            }
            else
                if(sir[i]==')'){
                  while(stsemne[k]!='(' && k>0){
                          sirsemne[j]=stsemne[k];
                          k--;
                          j++;
                  }
                  stsemne[k]=0;
                  k--;
                }
                else
                    if(sir[i]=='-' || sir[i]=='+'){
                        while(stsemne[k]!='(' && k>0){
                                sirsemne[j]=stsemne[k];
                                k--;
                                j++;
                        }
                        k++;
                        stsemne[k]=sir[i];
                    }
                    else
                        if(sir[i]=='*' || sir[i]=='/'){
                            while(stsemne[k]!='(' && stsemne[k]!='+' && stsemne[k]!='-' && k>0){
                                  if(stsemne[i]=='*' || stsemne[i]=='/'){
                                        sirsemne[j]=stsemne[k];
                                        k--;
                                        j++;
                                  }
                            }
                            k++;
                            stsemne[k]=sir[i];
                        }
    }
    while(k>0){
        sirsemne[j]=stsemne[k];
        k--;
        j++;
    }
    j--;
    k=0;
    for(i=1;i<=j;i++){
        if(sirnumere[i]==0 && sirsemne[i]!=0){
            if(sirsemne[i]=='-'){
                stnumere[k-1]=stnumere[k-1]-stnumere[k];
                k--;
            }
            if(sirsemne[i]=='+'){
                stnumere[k-1]=stnumere[k-1]+stnumere[k];
                k--;
            }
            if(sirsemne[i]=='*'){
                stnumere[k-1]=stnumere[k-1]*stnumere[k];
                k--;
            }
            if(sirsemne[i]=='/'){
                stnumere[k-1]=stnumere[k-1]/stnumere[k];
                k--;
            }
        }
        else{
            k++;
            stnumere[k]=sirnumere[i];
        }
    }
    cout<<stnumere[1];
    return 0;
}