Cod sursa(job #1592306)

Utilizator sicsicFMI-Coteanu Vlad sicsic Data 7 februarie 2016 14:20:27
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.22 kb
#include<fstream>
#include<stack>
#include<string.h>
using namespace std;
ifstream f("exp.in");
ofstream g("exp.out");
char V[100001];
struct el{int val; char op; bool tip;} A[100001],B[100001];
stack<char> S;
stack<int> Q;
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=='(')
        {
            S.push(A[i].op);
        }
        if(A[i].tip==0&&A[i].op==')')
        {
            while(!S.empty()&&S.top()!='(')
            {
                j++;
                B[j].tip=0; B[j].op=S.top();
                S.pop();
            }
            S.pop();
        }
        if(A[i].tip==0&&(A[i].op=='+'||A[i].op=='-'||A[i].op=='*'||A[i].op=='/'))
        {
            if(S.empty())
            {
                S.push(A[i].op);
            }
            else
            {
                while(!S.empty()&&prioritate(S.top())>prioritate(A[i].op))
                {
                    j++;
                    B[j].tip=0; B[j].op=S.top();
                    S.pop();
                }
                S.push(A[i].op);
            }
        }
    }
    while(!S.empty())
    {
        j++;
        B[j].tip=0; B[j].op=S.top();
        S.pop();
    }
  /*  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.top(); Q.pop();
            int b=Q.top(); Q.pop();
            Q.push(a+b);
        }
        if(B[i].tip==0&&B[i].op=='-')
        {
            int a=Q.top(); Q.pop();
            int b=Q.top(); Q.pop();
            Q.push(b-a);
        }
        if(B[i].tip==0&&B[i].op=='*')
        {
            int a=Q.top(); Q.pop();
            int b=Q.top(); Q.pop();
            Q.push(a*b);
        }
        if(B[i].tip==0&&B[i].op=='/')
        {
            int a=Q.top(); Q.pop();
            int b=Q.top(); Q.pop();
            Q.push(b/a);
        }
        if(B[i].tip==1)
        {
            Q.push(B[i].val);
        }
    }
    g<<Q.top()<<'\n';
    return 0;
}