Pagini recente » Cod sursa (job #371171) | Cod sursa (job #3293689) | Cod sursa (job #2375955) | Cod sursa (job #3285266) | Cod sursa (job #3284315)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fcin("evaluare.in");
ofstream fout("evaluare.out");
string s;
int vf,i;
struct elem
{
int val;
char semn;
};
elem stv[101001];
inline int priority(char x)
{
if(x=='0') return 0;
if(x=='+' || x=='-') return 1;
if(x=='*' || x=='/') return 2;
}
inline void golire(char x)
{
while(vf>1 && stv[vf-1].val!=-(1<<30) && priority(stv[vf].semn)>=priority(x))
{
if(stv[vf].semn=='+') stv[vf-1].val+=stv[vf].val;
if(stv[vf].semn=='*') stv[vf-1].val*=stv[vf].val;
if(stv[vf].semn=='-') stv[vf-1].val-=stv[vf].val;
if(stv[vf].semn=='/') stv[vf-1].val/=stv[vf].val;
vf--;
}
}
int main()
{
fcin>>s;
while(i<s.size())
{
if(s[i]=='(')
{
char p;
if(i-1==-1 || i-1=='(') p='+'; else p=s[i-1];
stv[++vf]={-(1<<30),p};
}
else if(s[i]==')')
{
golire('0');
stv[vf-1].val=stv[vf].val;
vf--;
if(i+1<s.size() && s[i+1]!=')')
golire(s[i+1]);
}
else if(isdigit(s[i]))
{
char p;
if(i-1==-1 || i-1=='(') p='+'; else p=s[i-1];
int val=0;
while(i<s.size() && isdigit(s[i])) val=val*10 +s[i]-48, i++; i--;
stv[++vf]={val,p};
if(i+1<s.size() && s[i+1]!=')')
golire(s[i+1]);
}
i++;
}
golire('0');
fout<<stv[1].val;
return 0;
}