Cod sursa(job #2115607)

Utilizator TavinciStefanescu Octavian Tavinci Data 26 ianuarie 2018 22:15:45
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.86 kb
#include <fstream>
#include <string.h>
#include <stack>
using namespace std;

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char s[200005];
char expresie[200005][40];
int cont=0;
bool ok=0;
int main()
{

    stack <char> semn;
    fin>>s;
    for(int i=0; i<strlen(s); i++)
    {
        if(isdigit(s[i]))
        {
            int c=0;
            while(isdigit(s[i]))
            {
                expresie[cont][c]=s[i];
                c++;
                i++;
            }
            cont++;
            i--;
        }
        else
        {
            if(s[i]=='*' || s[i]=='/')
            {
                if(semn.size()>0)
                while(semn.top()=='*' || semn.top()=='/')
                {
                    expresie[cont][0]=semn.top();
                    cont++;
                    semn.pop();
                }
            }
            else if(s[i]=='+' || s[i]=='-')
            {
                if(ok==0)
                    while(semn.size()>0)
                    {
                        expresie[cont][0]=semn.top();
                        cont++;
                        semn.pop();
                    }
                else
                {
                    if(semn.size()>0)
                    while(semn.top()!='(')
                    {
                        expresie[cont][0]=semn.top();
                        cont++;
                        semn.pop();
                    }
                }
            }
            else if(s[i]=='(')
                ok=1;
            else if(s[i]==')')
            {
                ok=0;
                while(semn.top()!='(')
                {
                    expresie[cont][0]=semn.top();
                    cont++;
                    semn.pop();
                }
                semn.pop();
            }
            semn.push(s[i]);
            if(s[i]==')')
                semn.pop();
        }
    }
    while(semn.size()>0)
    {
        expresie[cont][0]=semn.top();
        cont++;
        semn.pop();
    }
    stack <int> rez;
    for(int i=0; i<cont; i++)
    {
        if(isdigit(expresie[i][0]))
        {
            int nrr=0, p=0;
            while(isdigit(expresie[i][p]))
            {
                nrr=nrr*10+(expresie[i][p]-'0');
                p++;
            }
            rez.push(nrr);
        }
        else
        {
            int a=rez.top();
            rez.pop();
            int b=rez.top();
            rez.pop();
            if(expresie[i][0]=='+')
                rez.push(a+b);
            else if(expresie[i][0]=='-')
                rez.push(b-a);
            else if(expresie[i][0]=='*')
                rez.push(a*b);
            else if(expresie[i][0]=='/')
                rez.push(b/a);
        }
    }
    fout<<rez.top();
    return 0;
}