Cod sursa(job #1184457)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 12 mai 2014 19:33:40
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.34 kb
#include<iostream>
#include<fstream>
#include<cctype>
#include<cstdlib>
#include<cstring>
#define dim 100003
using namespace std;
ifstream f("polon.in");
ofstream g("polon.out");
int x,i,j,aux,varf1,varf2,stiv1,stiv2;
char op[dim],ch[dim],ch2[]={"+-*/()"};
char* c,oper[dim],polon[dim];
int expresie[dim],nr[dim],v[dim];
bool ok;

int main()
{
    f>>ch;
    c=strtok(ch,ch2);
    while (c != NULL)
    {
        v[++varf1]=atoi(c);
        c=strtok(NULL,ch2);
    }
    f.close();
    ifstream f("polon.in");
    f>>ch;
    for (i=0;i<strlen(ch);i++)
    {
        if (ch[i]=='+' || ch[i]=='-' || ch[i]=='*' || ch[i]=='/' || ch[i]=='(' || ch[i]==')')
        {
            op[++varf2]=ch[i];
            ok=false;
        }
        else
        {
            if (ok==false)
                varf2++;
            ok=true;
        }
    }
    varf1=0;
    for (i=1;i<=varf2;i++)
    if (op[i]==NULL)
    {
        nr[i]=v[++varf1];
    }
    for (i=1;i<=varf2;i++)
    {
        if (op[i]!=NULL)
        {
            if (op[i]=='*' || op[i]=='/')
            {
                if (oper[stiv2]=='*' || oper[stiv2]=='/')
                {
                    polon[++stiv1]=oper[stiv2];
                    oper[stiv2]=op[i];
                }
                else
                {
                    oper[++stiv2]=op[i];
                }
            }
            else if (op[i]=='(')
            {
                oper[++stiv2]=op[i];
            }
            else if (op[i]=='+' || op[i]=='-')
            {
                while (oper[stiv2]!='(' && stiv2>0 && (oper[stiv2]=='*' || oper[stiv2]=='/'))
                {
                    polon[++stiv1]=oper[stiv2];
                    stiv2--;
                }
                oper[++stiv2]=op[i];
            }
            else if (op[i]==')' )
            {
                while (oper[stiv2]!='(' && stiv2>0)
                {
                    if (oper[stiv2]!=NULL)
                    {
                        polon[++stiv1]=oper[stiv2];
                        stiv2--;
                    }
                }
                stiv2--;
            }
        }
        else
        {
            expresie[++stiv1]=nr[i];
        }
    }
    while (stiv2>0)
    {
        polon[++stiv1]=oper[stiv2];
        stiv2--;
    }
    /*for (i=1;i<=stiv1;i++)
        cout<<polon[i]<<' ';
    cout<<'\n';
    for (i=1;i<=stiv1;i++)
        cout<<expresie[i]<<' ';
    cout<<'\n';*/
    for (i=1;i<=stiv1;i++)
    {
        ok=false;
        if (polon[i]=='+')
        {
            expresie[i]=expresie[i-2]+expresie[i-1];
            ok=true;
        }
        else if (polon[i]=='-')
        {
            expresie[i]=expresie[i-2]-expresie[i-1];
            ok=true;
        }
        else if (polon[i]=='*')
        {
            expresie[i]=expresie[i-2]*expresie[i-1];
            ok=true;
        }
        else if (polon[i]=='/')
        {
            expresie[i]=expresie[i-2]/expresie[i-1];
            ok=true;
        }
        if (i>3 && ok)
        {
            expresie[i-1]=expresie[i-3];
        }
    }
    /*for (i=1;i<=stiv1;i++)
        cout<<polon[i]<<' ';
    cout<<'\n';
    for (i=1;i<=stiv1;i++)
        cout<<expresie[i]<<' ';*/
    g<<expresie[stiv1];
    f.close();g.close();
    return 0;
}