Pagini recente » Cod sursa (job #415822) | Cod sursa (job #1066785) | Cod sursa (job #1959407) | Cod sursa (job #2117452) | Cod sursa (job #1914962)
#include <bits/stdc++.h>
#define nmax 100005
#define infinit 1000000001
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char a[nmax];
int top,st[nmax];
///(=-infinit
///*=infinit
///infinit+1=/
///infinit+2=-
inline bool Numar(char c)
{
if('0'<=c && c<='9')
return true;
return false;
}
inline void Evaluare()
{
int i,numar;
for(i=0;a[i];)
{
if(a[i]=='+')
i++;
else if(a[i]=='-')
{
st[++top]=(infinit+2);
i++;
}
else if(a[i]=='(')
{
st[++top]=-infinit;
i++;
}
else if(a[i]=='*')
{
st[++top]=infinit;
i++;
}
else if(a[i]=='/')
{
st[++top]=infinit+1;
i++;
}
else if(Numar(a[i]))
{
numar=0;
while(Numar(a[i]))
{
numar=numar*10+(a[i]-'0');
i++;
}
while(st[top]==infinit)
{
numar*=st[top-1];
top-=2;
}
while(st[top]==(infinit+1))
{
numar=st[top-1]/numar;
top-=2;
}
if(st[top]==(infinit+2))
{
numar*=(-1);
top--;
}
st[++top]=numar;
}
else
{
numar=0;
while(st[top]!=-infinit)
{
numar+=st[top];
top--;
}
top--;
while(st[top]==infinit)
{
numar*=st[top-1];
top-=2;
}
while(st[top]==(infinit+1))
{
numar=st[top-1]/numar;
top-=2;
}
if(st[top]==(infinit+2))
{
numar*=(-1);
top--;
}
st[++top]=numar;
i++;
}
}
numar=0;
for(i=1;i<=top;i++)
numar+=st[i];
fout<<numar<<"\n";
}
int main()
{
fin>>a;
Evaluare();
return 0;
}