Cod sursa(job #2444376)

Utilizator paulm238Madaras Paul paulm238 Data 31 iulie 2019 13:26:51
Problema Evaluarea unei expresii Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.98 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("evaluare.in");
ofstream out("evaluare.out");
int i,n=100000,x,prioritate[10],l,z=1,h;
char  v[100000],p,fp[100000];

void push(char stiva[],int &k,char nr,char fp[], int &z)
{
    if(stiva[k-1]!='(' && k!=0)
    {
        int p,m;
        p=nr;
        m=stiva[k-1];;
        if(prioritate[p-39]>=prioritate[m-39])
        {
            fp[z]=stiva[k-1];
            z++;
            stiva[k-1]=nr;
        }
        else
        {
            stiva[k]=nr;
            k++;
        }
    }
    else
    {
        stiva[k]=nr;
        k++;
    }
}
void push1(char stiva[],int &k,char nr)
{
    stiva[k]=nr;
    k++;
}
void push2(char stiva[],int &k, char fp[], int &z)
{
    int i=k-1;
    while(stiva[i]!='(')
    {
        fp[z]=stiva[i];
        z++;
        i--;
        k--;
    }
    k=k-1;
}
void afisarefinal(char stiva[], char fp[], int &k, int &z)
{
    for(i=k-1; i>=0; i--)
    {
        fp[z]=stiva[i];
        z++;
    }
    k=0;
}
void formare(char fp[], char v[], int &z, int nr, int h, int j)
{
    int i=nr,ok,c=0,x;
    while(ok==0)
    {
        if(v[i+1]=='*' || v[i+1]=='+' || v[i+1]=='/' || v[i+1]=='-' || v[i+1]=='(' || v[i+1]==')' || i+1==j)
            ok=1;
        c++;
        i++;
    }
    i=nr;
    h=c;
    while(c!=0)
    {
        if(c==9)
        {
            x=v[i];
            if(x-48>1)
            {
                fp[z]=v[i];
                fp[z+1]='q';
                z=z+2;
            }
            else
            {
                fp[z]='q';
                z++;
            }
        }
        if(c==8)
        {
            x=v[i];
            if(x-48>1)
            {
                fp[z]=v[i];
                fp[z+1]='w';
                z=z+2;
            }
            else
            {
                fp[z]='w';
                z++;
            }
        }
        if(c==7)
        {
            x=v[i];
            if(x-48>1)
            {
                fp[z]=v[i];
                fp[z+1]='e';
                z=z+2;
            }
            else
            {
                fp[z]='e';
                z++;
            }
        }
        if(c==6)
        {
            x=v[i];
            if(x-48>1)
            {
                fp[z]=v[i];
                fp[z+1]='r';
                z=z+2;
            }
            else
            {
                fp[z]='r';
                z++;
            }
        }
        if(c==5)
        {
            x=v[i];
            if(x-48>1)
            {
                fp[z]=v[i];
                fp[z+1]='t';
                z=z+2;
            }
            else
            {
                fp[z]='t';
                z++;
            }
        }
        if(c==4)
        {
            x=v[i];
            if(x-48>1)
            {
                fp[z]=v[i];
                fp[z+1]='y';
                z=z+2;
            }
            else
            {
                fp[z]='y';
                z++;
            }
        }
        if(c==3)
        {
            x=v[i];
            if(x-48>1)
            {
                fp[z]=v[i];
                fp[z+1]='u';
                z=z+2;
            }
            else
            {
                fp[z]='u';
                z++;
            }
        }
        if(c==2)
        {
            x=v[i];
            if(x-48>1)
            {
                fp[z]=v[i];
                fp[z+1]='i';
                z=z+2;
            }
            else
            {
                fp[z]='i';
                z++;
            }
        }
        if(c==1)
        {
            fp[z]=v[i];
            z++;
        }
        i++;
        c=c-1;
    }
}

int main()
{
    p='(';
    l=p;
    prioritate[l-39]=0;
    p=')';
    l=p;
    prioritate[l-39]=0;
    p='*';
    l=p;
    prioritate[l-39]=1;
    p='/';
    l=p;
    prioritate[l-39]=1;
    p='+';
    l=p;
    prioritate[l-39]=2;
    p='-';
    l=p;
    prioritate[l-39]=2;
    in.get(v,100000);
    x=strlen(v);
    char stiva[n];
    int k=0;
    for(i=0; i<x; i++)
    {
        if(v[i]=='(')
            push1(stiva,k,v[i]);
        else if(v[i]==')')
            push2(stiva,k,fp,z);
        else if(v[i]=='*' || v[i]=='+' || v[i]=='/' || v[i]=='-')
            push(stiva,k,v[i],fp,z);
        else if(v[i]!='*' && v[i]!='+' && v[i]!='/' && v[i]!='-' && v[i]!=')' && v[i]!='(')
        {
            if(v[i+1]=='*' || v[i+1]=='+' || v[i+1]=='/' || v[i+1]=='-' || v[i+1]=='(' || v[i+1]==')')
            {
                fp[z]=v[i];
                z++;
            }
            else
            {
                formare(fp, v, z, i, h, x);
                cout<<h<<endl;
                i=i+h-1;
            }
        }
    }
    afisarefinal(stiva, fp, k, z);
    for(i=1; i<=z-1; i++)
        out<<fp[i];
    return 0;
}