Cod sursa(job #2444376)
| Utilizator | 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;
}
