Pagini recente » Cod sursa (job #3130669) | Cod sursa (job #2039231) | Cod sursa (job #71880) | Cod sursa (job #1811008) | Cod sursa (job #442216)
Cod sursa(job #442216)
#include <fstream>
#include <string>
#include <vector>
#define VAL 1
#define OP 2
using namespace std;
const char InFile[]="evaluare.in";
const char OutFile[]="evaluare.out";
ifstream fin(InFile);
ofstream fout(OutFile);
string s;
bool IsOp(char ch)
{
return ch=='+'||ch=='-'||ch=='*'||ch=='/';
}
long int eval(string exp)
{
vector<long int> v;
vector<char> op;
long int val=0;
long int last=VAL;
if(IsOp(exp[0]))
{
v.push_back(0);
op.push_back(exp[0]);
}
for(long int i=0;i<(long int)exp.size();++i)
{
if(IsOp(exp[i]))
{
last=OP;
op.push_back(exp[i]);
v.push_back(val);
val=0;
}
else if(exp[i]=='(')
{
string str2="";
int b=1;++i;
while(i<(long int)exp.size())
{
if(exp[i]=='(')
{
++b;
}
else if(exp[i]==')')
{
--b;
if(b==0)
{
break;
}
}
str2=str2+exp[i];
++i;
}
val=eval(str2);
last=VAL;
}
else
{
val=val*10+(exp[i]-'0');
last=VAL;
}
}
if(last==VAL)
{
v.push_back(val);
}
for(long int i=0;i<(long int)op.size();++i)
{
if(op[i]=='*')
{
v[i]=v[i]*v[i+1];
op.erase(op.begin()+i);
v.erase(v.begin()+i+1);
--i;
}
else if(op[i]=='/')
{
v[i]=v[i]/v[i+1];
op.erase(op.begin()+i);
v.erase(v.begin()+i+1);
--i;
}
}
for(long int i=0;i<(long int)op.size();++i)
{
if(op[i]=='-')
{
v[0]-=v[i+1];
}
else
{
v[0]+=v[i+1];
}
}
return v[0];
}
int main()
{
fin>>s;
fin.close();
fout<<eval(s);
fout.close();
return 0;
}