Pagini recente » Cod sursa (job #705042) | Cod sursa (job #1435283) | Monitorul de evaluare | Cod sursa (job #2066890) | Cod sursa (job #2037932)
#include <fstream>
#include <deque>
#include <cstring>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
deque <char> Op;
deque <int> Val;
int Prioritate(char c)
{
if(strchr("*/",c)) return 2;
if(strchr("+-",c)) return 1;
}
bool isOperator(char c)
{
if(strchr("+-*/",c)) return 1;
return 0;
}
void Do()
{
int a,b;
b=Val.back();
Val.pop_back();
a=Val.back();
Val.pop_back();
if(Op.back()=='+') Val.push_back(a+b);
if(Op.back()=='*') Val.push_back(a*b);
if(Op.back()=='/') Val.push_back(a/b);
if(Op.back()=='-') Val.push_back(a-b);
Op.pop_back();
}
void Read()
{
char x,last;
int nr=0;
while(fin>>x)
{
if(isdigit(x))
{ if(nr==-1) nr=x-'0';
else nr=nr*10+(int)(x-'0');
}
else { if(nr>-1) Val.push_back(nr);
//fout<<nr<<' ';
nr=-1;
}
if(x=='(') Op.push_back(x);
if(x==')')
{
while(Op.back()!='(') Do();
Op.pop_back();
}
if(isOperator(x))
{ while(!Op.empty() && Op.back()!='(')
if(Prioritate(Op.back())>=Prioritate(x))
Do();
else break;
Op.push_back(x);
}
last=x;
}
if(isdigit(last)) Val.push_back(nr);
while(!Op.empty()) Do();
}
void Print()
{
fout<<Val.back()<<'\n';
fout.close();
}
int main()
{
Read();
Print();
return 0;
}