Pagini recente » Cod sursa (job #1721173) | Cod sursa (job #2747891) | Cod sursa (job #2813831) | Cod sursa (job #1539692) | Cod sursa (job #1570178)
#include <cstdio>
#define MAX 1000000000
#define N 100004
#include <cstring>
#include <vector>
using namespace std;
int S[N],one,two,n,i,nr,s;
char a[N];
vector<int> post;
int sign[250];
bool digit(char x)
{
if(x>'9') return 0;
if(x<'0') return 0;
return 1;
}
int main()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
gets(a+1);
n=strlen(a+1);
a[n+1]=')';
a[0]='(';
++n;++n;
sign['+']=MAX+1;
sign['-']=MAX+2;
sign['*']=MAX+3;
sign['(']=MAX+4;
sign[')']=MAX+5;
sign['/']=MAX+6;
int rang[]={0,2,2,3,4,1,3};
for(i=0;i<n;++i)
{
if(digit(a[i]))
{
nr=0;
while(i<n && digit(a[i]))
{
nr=nr*10+a[i]-'0';
++i;
}
post.push_back(nr);
--i;
}
else
{
while(i<n && s && rang[sign[a[i]]-MAX]<=rang[S[s]-MAX] && S[s]!=sign['('])
post.push_back(S[s]), --s;
if(s && S[s]==sign['('] && a[i]==')') --s;
else
S[++s]=sign[a[i]];
}
}
s=0;
for(i=0;i<post.size();++i)
{
if(post[i]>MAX)
{
one=S[s-1];
two=S[s];
--s;
if(post[i]==sign['-']) S[s]=one-two;
else if(post[i]==sign['+']) S[s]=one+two;
else if(post[i]==sign['*']) S[s]=one*two;
else S[s]=one/two;
}
else S[++s]=post[i];
}
printf("%d\n",S[1]);
return 0;
}