Cod sursa(job #1280467)
Utilizator | Data | 1 decembrie 2014 23:16:08 | |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 3.62 kb |
#include <stdio.h>
#include <list>
FILE *fin, *fout;
std::list<long> num;
std::list<char> op;
bool ver(char ch1,char ch2)
{
if(ch1=='*'||ch1=='/') return 1;
if(ch1=='+'||ch1=='-')
{
if(ch2!='*'&&ch2!='/') return 1;
}
return 0;
}
int main()
{
fin = fopen("evaluare.in","r");
fout = fopen("evaluare.out", "w");
char ch;
long nr;
while(!feof(fin))
{
fscanf(fin,"%c",&ch);
if('0'<=ch&&ch<='9')
{
nr=0;
do
{
nr*=10;
nr+=(ch-'0');
fscanf(fin,"%c",&ch);
if(feof(fin)) break;
}while('0'<=ch&&ch<='9');
num.push_back(nr);
}
if(feof(fin)) break;
if(ch==')')
{
while(1)
{
if(op.back()=='(')
{
op.pop_back();
break;
}
else
{
if(op.back()=='+') num.push_back(-1);
else if(op.back()=='-') num.push_back(-2);
else if(op.back()=='*') num.push_back(-3);
else num.push_back(-4);
op.pop_back();
}
}
}
else
{
while(ver(op.back(),ch)==1)
{
if(op.back()=='+') num.push_back(-1);
else if(op.back()=='-') num.push_back(-2);
else if(op.back()=='*') num.push_back(-3);
else num.push_back(-4);
op.pop_back();
}
op.push_back(ch);
}
}
while(!op.empty())
{
if(op.back()=='+') num.push_back(-1);
else if(op.back()=='-') num.push_back(-2);
else if(op.back()=='*') num.push_back(-3);
else num.push_back(-4);
op.pop_back();
}
std::list<long>::iterator i;
std::list<long> rezultat;
int nr1,nr2,nr3;
while(!num.empty())
{
nr1=num.front();
num.pop_front();
if(nr1<0)
{
nr2=rezultat.back();
rezultat.pop_back();
nr3=rezultat.back();
rezultat.pop_back();
if(nr1==-1) rezultat.push_back(nr2+nr3);
else if(nr1==-2) rezultat.push_back(nr3-nr2);
else if(nr1==-3) rezultat.push_back(nr2*nr3);
else if(nr1==-4) rezultat.push_back(nr3/nr2);
}
else rezultat.push_back(nr1);
}
fprintf(fout,"%ld",rezultat.front());
}