Cod sursa(job #1592317)

Utilizator sicsicFMI-Coteanu Vlad sicsic Data 7 februarie 2016 14:27:13
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 3.27 kb
#include<fstream>
#include<string.h>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
char V[100001];
struct el{int val; char op; bool tip;} A[100001],B[100001];
char S[100001];
int Q[100001],QT,ST;
int prioritate(int c)
{
    int pr=0;
    if(c=='+'||c=='-') pr=1;
    if(c=='/'||c=='*') pr=2;
    return pr;
}
int main()
{
    f>>V;
    int L=strlen(V);
    ///prelucram sirul V in sirul A, astfel incat A.tip =1 pentru operanzi, iar A.tip=0 pentru operatii
    ///Unde A.tip==1, adica unde avem un operand, vom pune in A.val, valoarea intreaga a operandului
    ///Unde A.tip==0, adica unde avem o operatie, vom pune in A.op tipul operatiei: ( ) + - * /
    int N=-1;
    for(int i=0;i<L;++i)
    {
        N++;
        if(V[i]>='0'&&V[i]<='9')
        {
            int f=0;
            while(V[i]>='0'&&V[i]<='9')
            {
                f=f*10+V[i]-48;
                i++;
            }
            i--;
            A[N].tip=1;
            A[N].val=f;
        }
        else
        {
            A[N].tip=0;
            A[N].op=V[i];
        }
    }
    int j=-1;
    for(int i=0;i<=N;++i)
    {
        if(A[i].tip==1)
        {
            j++;
            B[j].tip=1;
            B[j].val=A[i].val;
        }
        if(A[i].tip==0&&A[i].op=='(')
        {
            ST++;
            S[ST]=A[i].op;
        }
        if(A[i].tip==0&&A[i].op==')')
        {
            while(ST>0&&S[ST]!='(')
            {
                j++;
                B[j].tip=0; B[j].op=S[ST];
                ST--;
            }
            ST--;
        }
        if(A[i].tip==0&&(A[i].op=='+'||A[i].op=='-'||A[i].op=='*'||A[i].op=='/'))
        {
            if(ST==0)
            {
                ST++;
                S[ST]=A[i].op;
            }
            else
            {
                while(ST>0&&prioritate(S[ST])>prioritate(A[i].op))
                {
                    j++;
                    B[j].tip=0; B[j].op=S[ST];
                    ST--;
                }
                ST++;
                S[ST]=A[i].op;
            }
        }
    }
    while(ST>0)
    {
        j++;
        B[j].tip=0; B[j].op=S[ST];
        ST--;
    }
  /*  for(int i=0;i<=j;++i)
    {
        if(B[i].tip) g<<B[i].val<<" ";
        else g<<B[i].op<<" ";
    }
    g<<'\n';*/
    //acum avand scrisa expresia in forma poloneza inversa (postfix), rezolvam expresia mai usor
    for(int i=0;i<=j;++i)
    {
        if(B[i].tip==0&&B[i].op=='+')
        {
            int a=Q[QT]; QT--;
            int b=Q[QT]; QT--;
            QT++;
            Q[QT]=b+a;
        }
        if(B[i].tip==0&&B[i].op=='-')
        {
            int a=Q[QT]; QT--;
            int b=Q[QT]; QT--;
            QT++;
            Q[QT]=b-a;
        }
        if(B[i].tip==0&&B[i].op=='*')
        {
            int a=Q[QT]; QT--;
            int b=Q[QT]; QT--;
            QT++;
            Q[QT]=b*a;
        }
        if(B[i].tip==0&&B[i].op=='/')
        {
            int a=Q[QT]; QT--;
            int b=Q[QT]; QT--;
            QT++;
            Q[QT]=b/a;
        }
        if(B[i].tip==1)
        {
            QT++;
            Q[QT]=B[i].val;
        }
    }
    g<<Q[QT]<<'\n';
    return 0;
}