Cod sursa(job #2190600)

Utilizator Marina23Oprea Marina Marina23 Data 31 martie 2018 11:53:40
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <string.h>

using namespace std;

#define Dim 100005

int i,Nr[Dim],X,Vfnr,Vfop,N;
short int  Prioritate[Dim];
char Sir[Dim],Oper[Dim];

int operatie(int A,int B,char Op)
{
    if(Op=='+') return A+B;
    if(Op=='-') return A-B;
    if(Op=='*') return A*B;
    return B/A;
}

void evaluare()
{
    if(Sir[i]==')')
    {
        while(Oper[Vfop]!='(') {Nr[Vfnr-1]=operatie(Nr[Vfnr],Nr[Vfnr-1],Oper[Vfop]); --Vfnr; --Vfop;}
        --Vfop;
    }
    else
        while(Vfnr>1)
            {Nr[Vfnr-1]=operatie(Nr[Vfnr],Nr[Vfnr-1],Oper[Vfop]); --Vfnr; --Vfop;}
}

int main()
{
    ifstream fin("evaluare.in"); ofstream fout("evaluare.out");

    fin>>Sir; N=strlen(Sir);
    Prioritate['(']=-1;
    Prioritate['+']=Prioritate['-']=0;
    Prioritate['*']=Prioritate['/']=1;
    i=0;
    while(i<=N-1)
    {
        if(Sir[i]>='0' and Sir[i]<='9')
        {
            X=0;
            while(i<=N-1 and Sir[i]>='0' and Sir[i]<='9') {X=X*10+(Sir[i]-'0'); ++i;}
            ++Vfnr; Nr[Vfnr]=X;
            continue;
        }
        if(Sir[i]=='(') {Oper[++Vfop]=Sir[i++]; continue;}
        if(Sir[i]==')') {evaluare(); ++i; continue;}
        if(Vfop==0 or Prioritate[Sir[i]]>Prioritate[Oper[Vfop]]) {Oper[++Vfop]=Sir[i++]; continue;}
        evaluare(); Oper[++Vfop]=Sir[i++];
    }
    evaluare();
    fout<<Nr[1];

    fin.close (); fout.close();
    return 0;
}