Pagini recente » Cod sursa (job #185823) | Cod sursa (job #1387375) | Cod sursa (job #1127983) | Cod sursa (job #2754630) | Cod sursa (job #1570213)
#include <cstdio>
#include <cstring>
#include <cctype>
#include <stack>
using namespace std;
int val[201],i,j,n,nr2,nr1,nr;
char s[200010],semn[200010],post[200010];
stack <int> Stiva;
int valoare(int a, int b, char c)
{
if (c=='+') return a+b;
if (c=='-') return a-b;
if (c=='*') return a*b;
if (c=='/') return a/b;
}
int main()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
gets(s+1);
n=strlen(s+1)+1;
s[0]='(';
s[n]=')';
val[')']=1;
val['+']=val['-']=2;
val['*']=val['/']=3;
val[')']=4;
nr=nr1=0;
for (i=1; i<=n; i++)
{
if (s[i]=='(') semn[++nr]='(';
else
{
if (isdigit(s[i]))
{
while (isdigit (s[i]))
{
post[++nr1] = s[i];
i++;
}
post[++nr1] = ',';
i--;
}
else
{
for (j=nr; j!=0 && semn[j]!='(' && val[s[i]]<=val[semn[j]]; j--)
post[++nr1]=semn[j];
if (s[i]!=')') semn[nr = j + 1] = s[i];
else nr=j-1;
}
}
}
for (i=1; i<=nr1; i++)
{
if (isdigit(post[i]))
{
nr2=0;
while (isdigit(post[i])) nr2=nr2*10+post[i++] -'0';
Stiva.push(nr2);
}
else
{
nr2=Stiva.top();
Stiva.pop();
Stiva.top()=valoare(Stiva.top(),nr2,post[i]);
}
}
printf("%d\n", Stiva.top());
return 0;
}