Pagini recente » Cod sursa (job #261110) | Cod sursa (job #473093) | Cod sursa (job #2499622) | Cod sursa (job #2272378) | Cod sursa (job #2764410)
#include <iostream>
#include <fstream>
#include <stack>
#include <cstring>
#include <vector>
using namespace std;
ifstream in ("evaluare.in");
ofstream out ("evaluare.out");
char s[100005];
int Next[100005],n;
stack <int> st;
int precalc()
{
n=strlen(s+1);
for(int i=1; i<=n; i++)
{
if(s[i]=='(')
st.push(i);
if(s[i]==')')
{
Next[st.top()]=i;
st.pop();
}
}
}
/// 1 = '+'
/// -1 = '-'
/// 3 = '*'
/// 4 = '/'
int solve(int st, int dr)
{
vector <int> v;
int semn=1,x=0,ans;
for(int i=st; i<=dr; i++)
{
if(s[i]=='(')
{
x=solve(i+1,Next[i]-1);
i=Next[i];
continue;
}
if(isdigit(s[i]))
{
x=x*10+(s[i]-'0');
continue;
}
if(semn==3)
{
v.back()*=x;
}
else if(semn==4)
v.back()/=x;
else v.push_back(semn*x);
if(s[i]=='*')
semn=3;
if(s[i]=='/')
semn=4;
if(s[i]=='+')
semn=1;
if(s[i]=='-')
semn=-1;
x=0;
}
if(semn==3)
{
v.back()*=x;
}
else if(semn==4)
v.back()/=x;
else v.push_back(semn*x);
for(int i=0; i<v.size(); i++)
{
ans+=v[i];
}
return ans;
}
int main()
{
in>>(s+1);
precalc();
out<<solve(1,n);
return 0;
}