Pagini recente » Cod sursa (job #827881) | Cod sursa (job #3283012) | Cod sursa (job #272098) | Cod sursa (job #2957550) | Cod sursa (job #1591009)
#include <fstream>
#include <iostream>
#include <stack>
#include <vector>
#include <cstring>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int NMAX = 100005,n,NEXT[100005];
char s[100005];
stack <int> St;
inline int Eval(const int st,const int dr)
{
vector <int> v;
int i,nr,x,semn,sol;
x = sol = 0;
semn = 1;
for(i = st; i <= dr; i++)
{
if(s[i]=='(')
{
x = Eval(i+1,NEXT[i]-1);
i = NEXT[i];
continue;
}
if('0'<= s[i] && s[i]<='9')
{
x=x*10+(s[i]-'0');
continue;
}
if(semn==0) v.back()*=x;
else if(semn==-2) v.back()/=x;
else v.push_back(semn*x);
if(s[i]=='*') semn = 0;
else if(s[i]=='/') semn = -2;
else
{
semn = 1;
if(s[i]=='-') semn = -1;
}
x = 0;
}
if(semn == 0) v.back()*=x;
else if(semn == -2) v.back()/=x;
else v.push_back(x*semn);
for(i = 0; i < v.size(); i++)
sol+=v[i];
return sol;
}
void Check()
{
int i;
for(i = 1; i <= n; i++)
{
if(s[i]=='(') St.push(i);
else if(s[i]==')')
{
NEXT[St.top()] = i;
St.pop();
}
}
}
int main()
{
fin>>(s+1);
n = strlen(s+1);
Check();
fout<<Eval(1,n)<<"\n";
fout.close();
return 0;
}