Pagini recente » Cod sursa (job #1471195) | Monitorul de evaluare | Cod sursa (job #1254241) | Cod sursa (job #1267782) | Cod sursa (job #3315242)
// Ilie "The-Winner" Dumitru
// Dumnezeu sa o ierte
#include<bits/stdc++.h>
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define err(...) fprintf(stderr, __VA_ARGS__)
using ll=long long;
using dbl=long double;
constexpr int NMAX=100'005;
constexpr ll MOD=1'000'000'007;
char s[NMAX];
int eval(int a, char op, int b)
{
if(op=='+')
return a+b;
if(op=='-')
return a-b;
if(op=='/')
return a/b;
return a*b;
}
int eval()
{
int i, x, a, b;
std::vector<int> st;
std::vector<char> ops;
for(i=0;i<NMAX && s[i] && s[i]!='\n';++i)
{
if(s[i]>='0' && s[i]<='9')
{
x=0;
while(s[i]>='0' && s[i]<='9')
x=x*10+s[i++]-'0';
--i;
st.push_back(x);
}
else if(s[i]=='(')
ops.push_back('(');
else if(s[i]==')')
{
while(ops.back()!='(')
{
b=st.back();
st.pop_back();
a=st.back();
st.pop_back();
st.push_back(eval(a, ops.back(), b));
ops.pop_back();
}
ops.pop_back();
}
else if(s[i]=='+' || s[i]=='-')
{
while(!ops.empty() && ops.back()!='(')
{
b=st.back();
st.pop_back();
a=st.back();
st.pop_back();
st.push_back(eval(a, ops.back(), b));
ops.pop_back();
}
ops.push_back(s[i]);
}
else
{
while(!ops.empty() && (ops.back()=='*' || ops.back()=='/'))
{
b=st.back();
st.pop_back();
a=st.back();
st.pop_back();
st.push_back(eval(a, ops.back(), b));
ops.pop_back();
}
ops.push_back(s[i]);
}
}
while(!ops.empty())
{
b=st.back();
st.pop_back();
a=st.back();
st.pop_back();
st.push_back(eval(a, ops.back(), b));
ops.pop_back();
}
return st[0];
}
int main()
{
FILE* f=fopen("evaluare.in", "r"), *g=fopen("evaluare.out", "w");
fgets(s, NMAX, f);
fprintf(g, "%d\n", eval());
fclose(f);
fclose(g);
return 0;
}