Pagini recente » Cod sursa (job #1468369) | Cod sursa (job #1526113) | Cod sursa (job #3281342) | Cod sursa (job #2095713) | Cod sursa (job #809442)
Cod sursa(job #809442)
#include <cstdio>
#include <iostream>
#include <map>
#include <string>
#define NMAX 100005
using namespace std;
map <char,int> H;
string s;
int nrs[NMAX],r,t;
char ops[NMAX];
void init()
{
H['*']=9; H['/']=9;
H['+']=8; H['-']=8;
H['(']=2; H[')']=2;
H['$']=1;
}
inline int cif(char x)
{
return x>='0' && x<='9';
}
void changes()
{
switch (ops[t])
{
case '+': nrs[r-1]=nrs[r-1]+nrs[r]; break ;
case '-': nrs[r-1]=nrs[r-1]-nrs[r]; break ;
case '*': nrs[r-1]=nrs[r-1]*nrs[r]; break ;
case '/': nrs[r-1]=nrs[r-1]/nrs[r]; break ;
}
r--; t--;
}
void solve()
{
ops[++t]='$';
int i;
char ch;
for (i=0; i<s.size(); i++)
{
ch=s[i];
if (cif(ch))
{
nrs[++r]=0;
while (i<s.size() && cif(s[i]))
nrs[r]=nrs[r]*10+s[i]-'0',i++;
i--;
continue ;
}
if (!H[ch])
continue;
if (ch=='(' || H[ch]>H[ops[t]])
{
ops[++t]=ch;
continue ;
}
if (H[ch]<=H[ops[t]])
{
while (H[ch]<=H[ops[t]] && ops[t]!='(')
changes();
if (ch==')' && ops[t]=='(')
{
t--;
continue ;
}
ops[++t]=ch;
}
}
while (t!=1)
changes();
cout<<nrs[1]<<'\n';
}
int main()
{
freopen("evaluare.in","r",stdin);
freopen("evaluare.out","w",stdout);
init();
cin>>s;
solve();
return 0;
}