Pagini recente » Cod sursa (job #1857085) | Cod sursa (job #777170) | Cod sursa (job #703627) | Cod sursa (job #1214362)
#include <fstream>
#include <cstring>
#include <vector>
#define MX 100005
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char s[MX];
int l;
struct elem
{
bool tip; //0=operand, 1=operator
int info;
};
vector<char> inf;
vector<elem> pof;
vector<int> rez;
int prio(char i)
{
if(i=='+' || i=='-') return 1;
else
if(i=='*' || i=='/') return 2;
else
return 0;
}
int numar(int &i)
{
int nr=0;
while(s[i]>='0' && s[i]<='9')
{
nr = nr*10 + s[i] - '0';
i++;
}
i--;
return nr;
}
void inf_to_pof()
{
int i;
elem e;
for(i=0; i<l; i++)
{
if( strchr("+-*/", s[i]) )
{
if(!inf.empty())
{
while( prio(inf.back()) >= prio(s[i]) )
{
e.tip = 0;
e.info = inf.back();
pof.push_back(e);
inf.pop_back();
}
}
inf.push_back(s[i]);
}
else
if( s[i]=='(' )
{
inf.push_back(s[i]);
}
else
if( s[i]==')' )
{
while( inf.back() != '(' )
{
e.tip = 0;
e.info = inf.back();
pof.push_back(e);
inf.pop_back();
}
inf.pop_back();
//fout<<inf.size()<<' '; fout.flush();
}
else
{
e.tip = 1;
e.info = numar(i);
pof.push_back(e);
}
//fout<<inf.size()<<' '; fout.flush();
}
while(!inf.empty())
{
e.tip = 0;
e.info = inf.back();
pof.push_back(e);
inf.pop_back();
}
}
void pof_to_rez()
{
vector<elem>::iterator it;
int o1,o2;
char x;
for(it=pof.begin(); it!=pof.end(); it++)
{
if( it->tip )
{
rez.push_back(it->info);
}
else
{
o2 = rez.back(); rez.pop_back();
o1 = rez.back(); rez.pop_back();
x = (char)(it->info);
switch(x)
{
case '+': rez.push_back(o1+o2); break;
case '-': rez.push_back(o1-o2); break;
case '*': rez.push_back(o1*o2); break;
case '/': rez.push_back(o1/o2); break;
}
}
}
}
int main()
{
fin>>s;
l = strlen(s);
inf_to_pof();
pof_to_rez();
//fout<<pof.size();
fout<<rez[0];
rez.clear();
pof.clear();
fin.close(); fout.close();
return 0;
}