Pagini recente » Cod sursa (job #675930) | Cod sursa (job #805931) | Cod sursa (job #908104) | Cod sursa (job #365970) | Cod sursa (job #883013)
Cod sursa(job #883013)
#include<fstream>
#include<cstring>
using namespace std;
const int MAXN=100001;
const char* INFILE="evaluare.in";
const char* OUTFILE="evaluare.out";
int lgs,lgp,vf=-1,vfrez=-1;
char s[MAXN];
char p[MAXN];
char st[MAXN];
long rez[MAXN];
void push(char x)
{
vf++;
st[vf]=x;
}
char pop()
{
char aux=st[vf];
st[vf]=0;
vf--;
return aux;
}
void citire()
{
ifstream fin(INFILE);
fin.getline(s,MAXN);
lgs=strlen(s);
fin.close();
}
int prioritate(char c)
{
switch (c)
{
case '(':
return 3;
case '*':
return 2;
case '/':
return 2;
case '+':
return 1;
case '-':
return 1;
case ')':
return 0;
default:
return -1;
}
}
void convert()
{
int i=0,nr;
for(i=0;i<lgs;i++)
{
if (s[i]>='0' && s[i]<='9')
{
nr=0;
while (s[i]>='0' && s[i]<='9')
{
nr=nr*10-s[i]+'0';
i++;
}
p[lgp++]=nr;
i--;
}
else
{
if (vf==-1)
push(s[i]);
else
{
if (s[i]==')')
{
while (st[vf]!='(')
{
p[lgp++]=pop();
}
pop();
}
else if (prioritate(st[vf])>=prioritate(s[i]) && st[vf]!='(')
{
p[lgp++]=pop();
push(s[i]);
}
else
push(s[i]);
}
}
}
while (vf!=-1)
p[lgp++]=pop();
}
long expresie (int x,int y,char op)
{
switch (op)
{
case '+':
return x+y;
case '-':
return x-y;
case '*':
return x*y;
case '/':
return x/y;
}
}
void rezolva()
{
//if (p[0]<=0)
int i=0;
for (i=0;i<lgp;i++)
{
if (p[i]<0)
{
rez[++vfrez]=0-p[i];
}
else
{
rez[vfrez-1]=expresie(rez[vfrez-1],rez[vfrez],p[i]);
rez[vfrez]=0;
vfrez--;
}
}
}
void afisare()
{
ofstream fout(OUTFILE);
fout<<rez[0];
fout.close();
}
int main()
{
citire();
convert();
rezolva();
afisare();
return 0;
}